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...catchtry...finallytry...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() { |