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

Я использую 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();