Код для выполнения и контроля над генерируемыми им исключениями
catch_statements
Все исключения будут попадать в блок catch_statements
exception_var
Переменная, которой присваивается пойманное исключение
finally_statements
Блок finally будет выполнен после окончания работы try/catch, вне зависимости от того, было ли исключение
Описание, примеры
Конструкция try..catch в javascript представлена в своей полной форме, включая необязательную ветку finally.
Допускается использование всех трех форм:
try...catch
try...finally
try...catch...finally
В любом случае сначала выполняется код блока try. Затем, если было исключение - оно перехватывается и выполняется код из catch. Затем, вне зависимости от работы try/catch, перед выходом из конструкции выполняется блок finally.
Пример: tryEval
Выделить все
function tryEval(code){try{eval(code)}catch(e){alert(e.name)}finally{alert("finished")}}
Запустим функцию tryEval с некорректным кодом.
При этом eval бросит исключение класса SyntaxError, что приведет к переходу управления в catch.
По окончанию catch выполнится finally.
Пример: некорректный код
function tryEval(code){try{eval(code)}catch(e){alert(e.name)}finally{alert("готово")}}
tryEval("Некорректный код")
Если код - правильный, то блок catch будет проигнорирован, но по окончании try - в любом случае запустится finally:
Пример: верный код
tryEval("var a=5")
Как правило, в finally ставят логирующий и очищающий состояние процессов код.
Вложенные try..catch
Зачастую в catch нужно ловить не все подряд, а определенные исключения.
В javascript это реализуется через проверку, например, при помощи instanceOf:
Выделить все
try{
...
}catch(e){if(!e instanceof MyError){// если не мое - бросаем дальшеthrow e
}
.. обработать исключение ..
}
Пример с tryEval с отловом ошибок будет выглядить следующим образом.
Пример: отлов только синтаксических ошибок
function tryEval(code){try{eval(code)}catch(e){if(!(e instanceof SyntaxError))throw ealert(e.name)}finally{alert("готово")}}try{
tryEval("throw new RangeError('исключение в корректном коде')")}catch(e){alert("Выпало "+e.name)}
При запуске код внутри eval генерирует ошибку RangeError.
Блок try..catch внутри функции tryEval ее ловит, но так как она не принадлежит классу SyntaxError - бросает дальше
Исключение выпадает из tryEval и ловится общим блоком в конце примера
Если исключение не поймано нигде - последний шанс его обработки до генерации javascript-ошибки: событие window.onerror: