Каковы стандартные практики для исключения JavaScript? - PullRequest
29 голосов
/ 13 мая 2010

w3schools говорит, что исключения могут быть строками, целыми числами, логическими значениями или объектами, но приведенный пример не кажется мне хорошей практикой, поскольку проверка типов исключений выполняется посредством сравнения строк. Является ли это предпочтительным методом обработки исключений в JavaScript? Существуют ли встроенные типы исключений (например, NullPointerException)? (если да, что это, какое наследство они используют и предпочитают ли они другим вариантам?)

Ответы [ 3 ]

11 голосов
/ 13 мая 2010

Исключениями может быть все что угодно.

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

JavaScript, однако, не имеет этой функции. Вы можете только перехватить все исключений, а затем посмотреть на значение, чтобы решить, что с ним делать. Если вы не хотите обрабатывать исключение, вам нужно вручную перехватить пойманное значение. (Это неизбежно делает catch заявления довольно грязными.)

Вы можете решить реализовать свои исключения как объекты и сравнить их с instanceof. Или вы можете иметь уникальные непрозрачные значения для сравнения. Или вы можете даже бросить прямые строки или числа, если вы действительно хотите.

Существуют ли встроенные типы исключений (например, NullPointerException)?

Вид. ECMAScript определяет некоторые стандартные классы ошибок: Error и его подтипы EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError. Однако существуют проблемы с реализацией браузера, например try { nonexistentvar; } дает TypeError под IE вместо ReferenceError. И есть много других специфичных для браузера исключений, особенно при работе с DOM.

Не принято использовать эти объекты напрямую, и попытка их подкласса является грязной (поскольку в JavaScript нет системы классов как таковой). Вместо этого вы будете придерживаться своих собственных определенных исключений для использования ваших собственных приложений. Исключения не так широко используются в JavaScript.

4 голосов
/ 13 мая 2010

Раздел 15.11 спецификации ECMA-262 определяет несколько типов Error, которые "выбрасываются в качестве исключений при возникновении ошибок времени выполнения ... [они] также могут служить базовыми объектами для определенных пользователем исключений классы «. Эта спецификация также определяет шесть других типов ошибок , которые являются частью языка.

Представляется предпочтительным выбрасывать исключения этих типов (или производных от них типов), поскольку их тип легче определить; у них также есть встроенное свойство сообщения.

По моему опыту, блоки try / catch встречаются довольно редко и кажутся действительно исключительными, а не неизбежными, как в Java.

3 голосов
/ 13 мая 2010

Можно попробовать Базовый проект Дина Эдвардса . Он эмулирует наследование классов в javascript, поэтому его использование позволит вам создать подкласс типа Error. Вы не можете поймать ошибки другого типа в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...