Четверг, 25.04.2024, 18:05
Приветствую Вас Гость

Меню сайта
Web-программирование
Наш опрос
Какой браузер Вы используете?
Всего ответов: 1422
Статистика

Анализ веб сайтов

try..catch

Ловить все исключения, выпадающие из блока кода

Синтаксис


1try {
2   try_statements
3}
4[catch (exception_var) {
5   catch_statements
6}]
7[finally {
8   finally_statements
9}]

Аргументы

try_statements
Код для выполнения и контроля над генерируемыми им исключениями

catch_statements
Все исключения будут попадать в блок catch_statements

exception_var
Переменная, которой присваивается пойманное исключение

finally_statements
Блок finally_statements будет выполнен после окончания работы try/catch, вне зависимости от того, было ли сгенерировано исключение

Описание, примеры

Конструкция try..catch в javascript представлена в своей полной форме, включая необязательную ветку finally.

Допускается использование всех трех форм:

  1. try...catch
  2. try...finally
  3. try...catch...finally

В любом случае сначала выполняется код блока try. Затем, если было исключение - оно перехватывается и выполняется код из catch. Затем, вне зависимости от работы try/catch, перед выходом из конструкции выполняется блок finally.

Пример: tryEval

1function tryEval(code) {
2  try{
3    eval(code)
4  } catch(e) {
5    alert(e.name)
6  } finally {
7    alert("finished")
8  }
9}

Запустим функцию tryEval с некорректным кодом.

При этом eval бросит исключение класса SyntaxError, что приведет к переходу управления в catch.

По окончанию catch выполнится finally.

Пример: некорректный код

01function tryEval(code) {
02  try{
03    eval(code)
04  } catch(e) {
05    alert(e.name)
06  } finally {
07    alert("готово")
08  }
09}
10 
11tryEval("Некорректный код")

Если код - правильный, то блок catch будет проигнорирован, но по окончании try - в любом случае запустится finally:

Пример: верный код

01function tryEval(code) {
02  try{
03    eval(code)
04  } catch(e) {
05    alert(e.name)
06  } finally {
07    alert("готово")
08  }
09}
10 
11tryEval("var a=5")

Как правило, в finally ставят логирующий и очищающий состояние процессов код.

Вложенные try..catch

Зачастую в catch нужно ловить не все подряд, а определенные исключения.

В javascript это реализуется через проверку, например, при помощи instanceOf:


1try {
2 ...
3} catch(e) {
4  if (!e instanceof MyError) {
5    // если не мое - бросаем дальше
6    throw e
7  }
8  .. обработать исключение ..
9}

Пример с tryEval с отловом ошибок будет выглядить следующим образом.

Пример: отлов только синтаксических ошибок

01function tryEval(code) {
02  try{
03    eval(code)
04  } catch(e) {
05    if (!(e instanceof SyntaxError)) throw e
06    alert(e.name)
07  } finally {
08    alert("готово")
09  }
10}
11 
12try {
13    tryEval("throw new RangeError('исключение в корректном коде')")
14} catch(e) {
15    alert("Выпало "+e.name)
16}
  1. При запуске код внутри eval генерирует ошибку RangeError.
  2. Блок try..catch внутри функции tryEval ее ловит, но так как она не принадлежит классу SyntaxError - бросает дальше
  3. Исключение выпадает из tryEval и ловится общим блоком в конце примера

Если исключение не поймано нигде - последний шанс его обработки до генерации javascript-ошибки: событие window.onerror:

Пример: window.onerror

1window.onerror = function() {
2  alert("OOPS!")
3}
4throw "something"
Реклама
Поиск
Друзья сайта
Топ100- Веб-дизайн free counters