В библиотеке Luxon разбор входных данных в тип DateTime
построен на принципе отказоустойчивости: большинство методов не
генерируют исключений при некорректном вводе, а возвращают специальный
объект с пометкой о невалидности. Такой подход требует отдельного
механизма проверки состояния результата и анализа причины ошибки.
При любом разборе строки или объекта в DateTime
результатом всегда является экземпляр DateTime, даже если
входные данные некорректны.
Ключевое поведение:
DateTimeDateTime, помеченный как
невалидныйСостояние определяется через свойства:
isValidinvalidReasoninvalidExplanationМетод:
DateTime.fromISO(value)
При корректной строке ISO возвращается валидный объект. При ошибках
форматирования результат остаётся объектом DateTime, но с
флагом невалидности.
Примеры некорректных входных данных:
Метод:
DateTime.fromFormat(value, format)
Механизм более чувствителен к несоответствию шаблону. Ошибки возникают при:
При этом результат не вызывает исключение, а возвращает невалидный
DateTime.
Метод:
DateTime.fromJSDate(date)
Ошибки возникают при:
Invalid DateDateГлавный механизм обработки ошибок основан на проверке:
dt.isValid
Если значение false, объект считается невалидным и не
должен использоваться в вычислениях.
Дополнительно доступны диагностические свойства:
dt.invalidReason — краткий код причиныdt.invalidExplanation — текстовое описание
проблемыНаиболее распространённые значения invalidReason:
unsupported — неподдерживаемая операция или форматunparsable — невозможность разобрать входную
строкуinvalidInput — некорректный тип входных данныхoutOfRange — значение выходит за допустимые границы
календаряКаждая причина отражает конкретный этап внутреннего процесса парсинга: токенизация, проверка диапазонов или интерпретация формата.
Luxon использует специальный механизм представления ошибки через
объект DateTime, находящийся в состоянии невалидности.
Создание такого объекта возможно напрямую:
DateTime.invalid("reason", "explanation")
Это позволяет:
Все методы DateTime сохраняют принцип «не прерывать
цепочку при ошибке».
Пример логики:
DateTimeЭто означает, что первичная причина сохраняется и распространяется дальше по цепочке.
Luxon содержит глобальную настройку, влияющую на стратегию обработки ошибок:
Settings.throwOnInvalid = true
При включении:
DateTime выбрасывается
исключениеtry/catchПри выключенном режиме:
Некорректные значения могут возникать не только при разборе даты, но и при интерпретации дополнительных параметров:
Ошибки:
В таких случаях объект остаётся созданным, но может быть приведён к дефолтной зоне или помечен как невалидный при критической ошибке.
DateTime.fromISO("2024-99-99")
Результат:
isValid = falseDateTime.fromFormat("31/02/2024", "dd/MM/yyyy")
Результат:
DateTime.fromISO(null)
Результат:
invalidInputПри работе с невалидными объектами основную роль играет комбинация трёх свойств:
isValid — бинарное состояниеinvalidReason — классификация ошибкиinvalidExplanation — человекочитаемая диагностикаТакая модель позволяет:
В цепочках преобразований поведение стабильно:
.setZone,
.plus, .minusЭто предотвращает скрытое восстановление некорректных данных.
isValidtry/catchПри парсинге Luxon выполняет последовательность этапов:
На любом этапе может быть зафиксировано состояние ошибки, после чего
объект переводится в режим invalid.
Система обработки ошибок построена таким образом, чтобы:
Такая архитектура делает обработку дат детерминированной даже при некорректных входных данных.