Как проверить, что содержимое 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 кажется легким.

Другие вопросы по тегам