Как проверить, что содержимое TDateTime действительно
Есть ли способ проверить, имеет ли переменная Delphi TDateTime допустимое содержимое без перехвата исключений при преобразованиях?
Я написал приложение, которое должно анализировать сотни огромных файлов, написанных как необработанные записи Delphi, которые содержат поле TDateTime. Иногда я получаю запись, где содержимое имеет значение TDateTime, например 2.0927117954e+262, которое дает Floating point invalid Operation
исключение при передаче в процедуры преобразования. Я знаю, что могу просто перехватить исключение, но это такая неприятность при отладке, поскольку отладчик продолжает останавливаться, и я хочу оставить его включенным в случае других ошибок.
3 ответа
Значение вашего примера явно выходит за пределы допустимого диапазона DateTime. Вы можете проверить, находится ли он в диапазоне, прежде чем выполнять какое-либо преобразование.
var
d: TDateTime;
..
d := 2.0927117954e+262;
if (d <= MaxDateTime) and (d >= MinDateTime) then
s := DateTimeToStr(d)
else
..
Если ваша проблема - остановка отладчика, вы можете исправить это в IDE более поздних версий Delphi. Установите две точки останова до и после строки, где произойдет исключение. Например, в Delphi 2007 щелкните правой кнопкой мыши на красной точке поля для первого BP, выберите Свойства точки останова / Дополнительно / Игнорировать последующие исключения. На втором БП "Обработка последующих исключений"
Я обнаружил, что VCL включает в себя функцию именно для этой цели, SysUtils.TryFloatToDateTime, и ее использование, безусловно, является наилучшим вариантом.
Поскольку у меня нет Delphi под рукой, вот пример использования C++ - Builder:
bool isValidDateTime(const double dt) {
TDateTime dummy;
return Sysutils::TryFloatToDateTime(dt, dummy);
}
... "портировать" его на Delphi кажется легким.