Settings.throwOnInvalid управляет стратегией обработки
некорректных значений времени в Luxon. Речь идёт о ситуации, когда
создаётся или преобразуется объект DateTime, но входные
данные не могут быть интерпретированы как валидная дата.
В обычном режиме Luxon не прерывает выполнение программы при ошибке
парсинга. Вместо этого возвращается объект DateTime,
помеченный как невалидный. При включении throwOnInvalid
поведение становится строгим: вместо объекта с состоянием ошибки
выбрасывается исключение.
Ключевая идея настройки:
false (значение по умолчанию): ошибки представлены
через объект DateTime с состоянием
invalidtrue: ошибки приводят к немедленному выбросу
исключенияПри стандартной конфигурации:
import { DateTime } from "luxon";
const dt = DateTime.fromISO("not-a-date");
console.log(dt.isValid); // false
console.log(dt.invalidReason); // объяснение причины
console.log(dt.invalidExplanation); // детальное описание
Объект при этом остаётся экземпляром DateTime, что
позволяет продолжать цепочки вызовов, но любые операции будут возвращать
невалидные результаты.
Настройка изменяется через глобальный объект
Settings:
import { Settings, DateTime } from "luxon";
Settings.throwOnInvalid = true;
const dt = DateTime.fromISO("not-a-date");
В этом режиме выполнение кода прерывается исключением:
RangeError: Invalid DateTime
или более детализированным сообщением в зависимости от источника ошибки.
Settings.throwOnInvalid = true;
DateTime.fromISO("2024-13-40");
Любое нарушение формата или логики календаря приводит к исключению. Например:
DateTime.fromFormat("32/01/2024", "dd/MM/yyyy");
Если вход не соответствует формату, происходит выброс ошибки, а не возврат невалидного объекта.
DateTime.fromMillis(NaN);
или
DateTime.fromSeconds("abc");
Любая невозможность привести значение к числу также приводит к исключению.
isValidconst dt = DateTime.fromISO("invalid");
if (!dt.isValid) {
console.log(dt.invalidReason);
}
try/catchDateTime в невалидном
состоянииtry {
const dt = DateTime.fromISO("invalid");
} catch (e) {
console.log("Ошибка парсинга даты");
}
В Luxon часто используются цепочки преобразований:
DateTime.fromISO("2024-01-01")
.plus({ days: 5 })
.setZone("Europe/Paris")
.toISO();
При throwOnInvalid = true ошибка в любом промежуточном
этапе разрывает цепочку мгновенно. При выключенной настройке ошибка
может оставаться скрытой до момента использования результата.
При стандартном режиме:
const dt = DateTime.fromISO("bad");
console.log(dt.isValid); // false
console.log(dt.toISO()); // null
Invalid объект сохраняет структуру:
invalidReasoninvalidExplanationОднако он не участвует в корректных вычислениях времени.
Используется, когда данные должны быть гарантированно корректны:
Settings.throwOnInvalid = true;
function parseEvent(dateStr) {
return DateTime.fromISO(dateStr);
}
Любая ошибка превращается в исключение, что позволяет централизованно обрабатывать сбои.
В тестовой среде строгий режим позволяет выявлять ошибки сразу:
beforeAll(() => {
Settings.throwOnInvalid = true;
});
Это предотвращает ситуацию, когда тесты проходят с невалидными объектами.
При обработке пользовательского ввода:
app.post("/event", (req, res) => {
try {
const dt = DateTime.fromISO(req.body.date);
res.send({ ok: true });
} catch {
res.status(400).send({ error: "invalid date" });
}
});
Settings.throwOnInvalid является глобальной настройкой
для всего процесса выполнения JavaScript.
Это означает:
Settings.throwOnInvalid = true;
// в другом модуле
DateTime.fromISO("bad"); // уже кидает исключение
Строгий режим может приводить к трудноуловимым проблемам:
Особенно критично при:
Часто используется динамическое переключение:
const previous = Settings.throwOnInvalid;
Settings.throwOnInvalid = true;
try {
const dt = DateTime.fromISO(input);
} finally {
Settings.throwOnInvalid = previous;
}
Такой подход позволяет ограничить область строгой проверки.
Luxon имеет набор глобальных настроек, и throwOnInvalid
взаимодействует с ними косвенно:
locale) не влияет на факт валидностиzone) не исправляют некорректные
значенияОшибка возникает до этапа форматирования или вычислений.
Пример цепочки:
DateTime.fromISO("2024-01-01")
.plus({ days: 10 })
.setZone("invalid-zone")
.toISO();
В строгом режиме ошибка зоны приведёт к немедленному исключению на
этапе setZone.
В мягком режиме может появиться invalid DateTime,
который распространяется дальше по цепочке.
| Поведение | throwOnInvalid = false | throwOnInvalid = true |
|---|---|---|
| Парсинг ошибки | возвращается invalid DateTime | выбрасывается исключение |
| Проверка | через isValid |
через try/catch |
| Цепочки | продолжаются с invalid состоянием | прерываются |
| Диагностика | постфактум | мгновенная |
Settings.throwOnInvalid = true;
// забыто вернуть обратно
Это приводит к неожиданным падениям в других частях системы.
Некорректное предположение:
Разные модули могут ожидать разное поведение:
isValidtry/catchЭто создаёт несогласованность архитектуры обработки времени.
Settings.throwOnInvalid фактически определяет стиль
работы с датами:
Выбор влияет на: