Ловить все исключения, выпадающие из блока кода
try {
try_statements
}
[catch (exception_var) {
catch_statements
}]
[finally {
finally_statements
}]
catch_statementsfinally_statements будет выполнен после окончания работы try/catch, вне зависимости от того, было ли сгенерировано исключениеКонструкция try..catch в javascript представлена в своей полной форме, включая необязательную ветку finally.
Допускается использование всех трех форм:
try...catchtry...finallytry...catch...finallyВ любом случае сначала выполняется код блока try. Затем, если было исключение - оно перехватывается и выполняется код из catch. Затем, вне зависимости от работы try/catch, перед выходом из конструкции выполняется блок finally.
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)
}
RangeError.try..catch внутри функции tryEval ее ловит, но так как она не принадлежит классу SyntaxError - бросает дальшеtryEval и ловится общим блоком в конце примераЕсли исключение не поймано нигде - последний шанс его обработки до генерации javascript-ошибки: событие window.onerror:
window.onerror = function() {
alert("OOPS!")
}
throw "something"
| Поиск по сайту |
| Последние темы на форуме |
Forum |
В описании не хватает свойств, какие есть у объекта Exception. Например многим description скажет намного больше name. А строка где это произошло - ещё больше.
"exception_var Переменная, которой присваивается пойманное исключение"
Т.е это не отдельный объект, а просто ссылка на исключение (которым может быть любой тип данных). А описание объекта Error есть в соответствующей статье.
При использовании try при любом раскладе необходим либо catch либо finally либо оба сразу. Без них выдает ошибку. Жаль
А нахрена блок try {} без catch или finally? Если так хочется блока, то и используй просто {}.
а какие еще есть классы ошибок кроме SyntaxError ?
try {} без обработки нужен для того чтобы программа не вылетала, например удобно при разработке программ для модемов с Java, т.к. отсутствует возможность пошаговой отладки
А что мешает использовать try с пустым блоком catch в этих целях? 0_о
Ничто не мешает, просто лишняя строка