Справочник javascript: try..catch

Синтаксис

try {
   try_statements
}
[catch (exception_var) {
   catch_statements
}]
[finally {
   finally_statements
}]

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

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

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

  1. try...catch
  2. try...finally
  3. 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:

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

function tryEval(code) {
  try{
    eval(code)
  } catch(e) {
    alert(e.name)
  } finally {
    alert("готово")
  }
}

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 e*/!*
    alert(e.name)
  } finally {
    alert("готово")
  }
}

try {
    tryEval("throw new RangeError('исключение в корректном коде')")
} catch(e) {
    alert("Выпало "+e.name)
}
  1. При запуске код внутри eval генерирует ошибку RangeError.
  2. Блок try..catch внутри функции tryEval ее ловит, но так как она не принадлежит классу SyntaxError - бросает дальше
  3. Исключение выпадает из tryEval и ловится общим блоком в конце примера

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

Пример: window.onerror

window.onerror = function() { 
  alert("OOPS!") 
}
throw "something"