Правильное использование ошибок


156

Я использую TypeScript для достаточно большого проекта, и мне интересно, каков стандарт для использования Errors. Например, скажем, я передаю исключение индекса вне границ в Java:

throw new IndexOutOfBoundsException();

Будет ли эквивалентный оператор в TypeScript:

throw new Error("Index Out of Bounds");

Какие еще способы я могу сделать это? Что является принятым стандартом?

Ответы:


166

Кто-то разместил эту ссылку на MDN в комментарии, и я думаю, что это было очень полезно . Он описывает такие вещи, как ErrorTypes очень тщательно.

EvalError --- Создает экземпляр, представляющий ошибку, которая возникает в отношении глобальной функции eval ().

InternalError --- Создает экземпляр, представляющий ошибку, которая возникает при возникновении внутренней ошибки в механизме JavaScript. Например, "слишком много рекурсии".

RangeError --- Создает экземпляр, представляющий ошибку, которая возникает, когда числовая переменная или параметр выходит за пределы допустимого диапазона.

ReferenceError --- Создает экземпляр, представляющий ошибку, которая возникает при разыменовании недействительной ссылки.

Ошибка синтаксиса --- Создает экземпляр, представляющий синтаксическую ошибку, которая возникает при синтаксическом анализе кода в eval ().

TypeError --- Создает экземпляр, представляющий ошибку, которая возникает, когда переменная или параметр недопустимого типа.

URIError --- Создает экземпляр, представляющий ошибку, которая возникает, когда encodeURI () или decodeURI () передают недопустимые параметры.


Похоже, отсутствует более общий тип для недопустимого аргумента . Не все недействительные аргументы подпадают под RangeError. Вы должны определить пользовательские типы или просто throw new Error("<message>");?
Андро

58

Соглашение для вне диапазона в JavaScript использует RangeError. Для проверки типа используйте if / else +, instanceofначиная с наиболее специфичного для наиболее общего

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}

2
Как насчет общей ошибки? И / или где находится список встроенных классов ошибок JS?
питосалась

7
В Mozilla Developer Network есть список типов ошибок JavaScript и другая информация: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Кристиан Давен,

6
@ Басарат Я думаю, вы должны добавить else { throw; }сюда
knocte

44

Простое решение для отправки и показа сообщения путем исключения.

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

предосторожность

Выше это не решение, если мы не знаем, какую ошибку можно выдать из блока. В таких случаях следует использовать средства защиты типов и правильно обрабатывать ошибки - взгляните на ответ @Moriarty.


Спасибо за указатель на явное приведение типов. Я не нашел эту информацию в Typescript-Docs и кое-что узнал сегодня.
JackLeEmmerdeur

Вы знаете, какова цель добавления <Error>? e.message прекрасно работает для меня.
sbattou

1
@sbattou единственная цель <Error>- сообщить компилятору TS, что eздесь тип, <Error>так что у вас есть (1) intellisense и (2) лучшая проверка типов. Имейте в виду, что любой актерский состав вообще не переводится в JS и является чисто синтаксическим сахаром.
Didii

25

Не забудьте про операторы 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();


3
Это круто; кажется надежнее и чище, чем другие ответы.
Виктор Заманян
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.