try..catch
Ловить все исключения, выпадающие из блока кода
Синтаксис
4 | [ catch (exception_var) { |
Аргументы
- try_statements
- Код для выполнения и контроля над генерируемыми им исключениями
-
- catch_statements
- Все исключения будут попадать в блок
catch_statements
-
- exception_var
- Переменная, которой присваивается пойманное исключение
-
- finally_statements
- Блок
finally_statements будет выполнен после окончания работы try/catch , вне зависимости от того, было ли сгенерировано исключение
-
Описание, примеры
Конструкция try..catch в javascript представлена в своей полной форме, включая необязательную ветку finally .
Допускается использование всех трех форм:
try...catch try...finally try...catch...finally
В любом случае сначала выполняется код блока try . Затем, если было исключение - оно перехватывается и выполняется код из catch . Затем, вне зависимости от работы try/catch , перед выходом из конструкции выполняется блок finally .
Пример: tryEval
1 | function tryEval(code) { |
Запустим функцию tryEval с некорректным кодом.
При этом eval бросит исключение класса SyntaxError, что приведет к переходу управления в catch .
По окончанию catch выполнится finally .
Пример: некорректный код
01 | function tryEval(code) { |
11 | tryEval( "Некорректный код" ) |
Если код - правильный, то блок catch будет проигнорирован, но по окончании try - в любом случае запустится finally :
Пример: верный код
01 | function tryEval(code) { |
Как правило, в finally ставят логирующий и очищающий состояние процессов код.
Вложенные try..catch
Зачастую в catch нужно ловить не все подряд, а определенные исключения.
В javascript это реализуется через проверку, например, при помощи instanceOf:
4 | if (!e instanceof MyError) { |
8 | .. обработать исключение .. |
Пример с tryEval с отловом ошибок будет выглядить следующим образом.
Пример: отлов только синтаксических ошибок
01 | function tryEval(code) { |
05 |
if (!(e instanceof SyntaxError)) throw e |
13 | tryEval( "throw new RangeError('исключение в корректном коде')" ) |
15 | alert( "Выпало " +e.name) |
- При запуске код внутри eval генерирует ошибку
RangeError . - Блок
try..catch внутри функции tryEval ее ловит, но так как она не принадлежит классу SyntaxError - бросает дальше - Исключение выпадает из
tryEval и ловится общим блоком в конце примера
Если исключение не поймано нигде - последний шанс его обработки до генерации javascript-ошибки: событие window.onerror :
Пример: window.onerror
1 | window.onerror = function () { |
|