Javascript.RU

try..catch

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

Синтаксис

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

Аргументы

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
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"

См. также

  • throw /Синтаксическая конструкция/

Автор: Гость (не зарегистрирован), дата: 29 апреля, 2010 - 16:51
#permalink

В описании не хватает свойств, какие есть у объекта Exception. Например многим description скажет намного больше name. А строка где это произошло - ещё больше.


Автор: Гость (не зарегистрирован), дата: 23 марта, 2011 - 15:37
#permalink

"exception_var Переменная, которой присваивается пойманное исключение"
Т.е это не отдельный объект, а просто ссылка на исключение (которым может быть любой тип данных). А описание объекта Error есть в соответствующей статье.


Автор: Жорик (не зарегистрирован), дата: 14 августа, 2010 - 02:23
#permalink

При использовании try при любом раскладе необходим либо catch либо finally либо оба сразу. Без них выдает ошибку. Жаль


Автор: Гость (не зарегистрирован), дата: 21 июля, 2011 - 16:04
#permalink

А нахрена блок try {} без catch или finally? Если так хочется блока, то и используй просто {}.


Автор: Гость (не зарегистрирован), дата: 4 мая, 2011 - 18:07
#permalink

а какие еще есть классы ошибок кроме SyntaxError ?


Автор: Yuriy1 (не зарегистрирован), дата: 23 сентября, 2011 - 17:29
#permalink

try {} без обработки нужен для того чтобы программа не вылетала, например удобно при разработке программ для модемов с Java, т.к. отсутствует возможность пошаговой отладки


Автор: Гость (не зарегистрирован), дата: 22 декабря, 2014 - 18:42
#permalink

А что мешает использовать try с пустым блоком catch в этих целях? 0_о


Автор: Гость (не зарегистрирован), дата: 23 января, 2015 - 16:02
#permalink

Ничто не мешает, просто лишняя строка


Автор: Гость (не зарегистрирован), дата: 10 ноября, 2015 - 18:11
#permalink
[js]
[html]
[css]
<code><ul>
 <li><ol>
 <li><em><strong>try</strong></em></li>
</ol></li>
</ul></code>[/css][/html][/js]

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
8 + 5 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Реклама
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum