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

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');
    }
}
basarat
источник
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();

Moriarty
источник
3
Это круто; кажется надежнее и чище, чем другие ответы.
Виктор Заманян