w3schools говорит, что исключения могут быть строками, целыми числами, булевыми или объектами, но приведенный пример не показывает мне хорошую практику, так как проверка типа исключения выполняется путем сравнения строк. Является ли это предпочтительным методом обработки исключений в JavaScript? Существуют ли встроенные типы исключений (например, NullPointerException)? (если да, каковы они, какое наследование они используют, и предпочитают ли они другие варианты?)
Каковы стандартные методы для исключения JavaScript-исключений?
Ответ 1
Исключения могут быть любыми, что вам нравится.
В других языках исключения должны быть экземплярами, а затем оператор catch
выбирает те исключения для catch и которые позволяют пропустить класс экземпляра.
JavaScript, однако, не имеет этой функции. Вы можете использовать только все исключения, а затем посмотреть на значение, чтобы решить, что с ним делать. Если вы не хотите обрабатывать исключение, вам нужно повторно выбросить пойманное значение вручную. (Это неизбежно делает заявления catch
довольно грязными.)
Вы можете реализовать свои исключения как объекты и сравнить их с instanceof
. Или у вас могут быть уникальные непрозрачные значения для сравнения. Или вы даже можете вытащить прямые строки или цифры, если вы действительно этого хотите.
Существуют ли встроенные типы исключений (например, NullPointerException)?
Вид. ECMAScript определяет некоторые стандартные классы ошибок: Error
и его подтипы EvalError
, RangeError
, ReferenceError
, SyntaxError
, TypeError
, URIError
. Однако есть проблемы с реализацией браузера, например try { nonexistentvar; }
дает TypeError
в IE вместо ReferenceError
. И есть много других специфичных для браузера исключений, особенно при работе с DOM.
Не традиционно использовать эти объекты напрямую, а попытки их подкласса являются беспорядочными (поскольку JavaScript не имеет системы классов как таковой). Вместо этого вы склонны придерживаться своих собственных определенных исключений для использования ваших собственных приложений. Исключения не так широко используются в JavaScript.
Ответ 2
Раздел 15.11 спецификация ECMA-262 определяет несколько типов Error
, которые "выбрасываются как исключения при возникновении ошибок времени выполнения... [они] могут также служить базовыми объектами для пользовательских классов исключений". Эта спецификация также определяет шесть других типов ошибок, которые являются частью языка.
Кажется предпочтительным бросить исключения из этих типов (или типов, полученных из них), поскольку их легче определить; они также имеют встроенное свойство сообщения.
В моем собственном опыте блоки try/catch несколько редки и кажутся действительно исключительными, а не неизбежными, как в Java.
Ответ 3
Вы можете попробовать Dea Edwards Базовый проект. Он эмулирует наследование класса в javascript, поэтому его использование позволит вам подклассифицировать тип ошибки. Вы не можете поймать разные типы ошибок в javascript (так как это не сильный типизированный язык), но вы можете определить тип ошибки, которая была выбрана, и добавить логику для этого конкретного типа, например:
try {
// do something
} catch (e) {
if (e instanceof NullPointerError) {
// handle nullpointer exception
} else if (e instanceof RuntimeError) {
// handle runtime exception
} else {
// regular exception
}
}
Конечно, в этом коде я предполагаю, что вы объявили классы NullPointerError и RuntimeError как подклассы Error.