Правильное использование ошибок
Я использую TypeScript для достаточно большого проекта, и мне интересно, каков стандарт для использования Error
. Например, я передаю исключение индекса вне границ в Java:
throw new IndexOutOfBoundsException();
Будет ли эквивалентный оператор в TypeScript:
throw new Error("Index Out of Bounds");
Какие еще способы я могу сделать это? Что является принятым стандартом?
Ответы
Ответ 1
Кто-то разместил эту ссылку в MDN в комментарии, и я думаю, что это было очень полезно. Он очень хорошо описывает такие вещи, как ErrorTypes.
EvalError --- Создает экземпляр, представляющий ошибку, возникающую в отношении глобальной функции eval().
InternalError --- Создает экземпляр, представляющий ошибку, возникающую при вызове внутренней ошибки в JavaScript-движке. Например. "слишком много рекурсии".
RangeError --- Создает экземпляр, представляющий ошибку, которая возникает, когда числовая переменная или параметр находится за пределами ее допустимого Диапазон.
ReferenceError --- Создает экземпляр, представляющий ошибку, возникающую при удалении ссылки на недопустимую ссылку.
SyntaxError --- Создает экземпляр, представляющий синтаксическую ошибку, возникающую при анализе кода в eval().
TypeError --- Создает экземпляр, представляющий ошибку, которая возникает, когда переменная или параметр не имеют допустимого типа.
URIError --- Создает экземпляр, представляющий ошибку, которая возникает, когда encodeURI() или decodeURI() передаются недопустимые параметры.
Ответ 2
Соглашение о внедиапазоне JavaScript использует RangeError
. Чтобы проверить тип использования, если /else + instanceof
, начиная с наиболее специфичного для самого общего
try {
throw new RangeError();
}
catch (e){
if(e instanceof RangeError){
console.log('out of range');
}
}
Ответ 3
Простое решение для отправки и показа сообщения с помощью исключения.
try {
throw new TypeError("Error message");
}
catch (e){
console.log((<Error>e).message);//conversion to Error type
}
Внимание
Выше не является решением, если мы не знаем, какая ошибка может быть выдана из блока. В таких случаях следует использовать средства защиты типов и правильно обрабатывать ошибки - взгляните на ответ @Moriarty.
Ответ 4
Не забудьте про операторы switch:
- Обеспечьте обработку с помощью
default
.
instanceof
может совпадать с суперклассом.
- ES6
constructor
будет соответствовать точному классу.
- Легче читать.
function handleError() {
try {
throw new RangeError();
}
catch (e) {
switch (e.constructor) {
case Error: return console.log('generic');
case RangeError: return console.log('range');
default: return console.log('unknown');
}
}
}
handleError();