Конструкция try catch finally
В процессе работы прогаммы могут возникать различные ошибки, которые нарушают привычный ход программы и даже заставляют ее прервать выполнение. Язык JavaScript имеет инструменты для обаботки таких ситуаций.
Простейшая ситуация - вызов функции, которой не существует:
callSomeFunc();
console.log("Остальные инструкции");
Здесь вызывается функция callSomeFunc()
, которая нигде не определена. Соответственно при вызове этой функции мы столкнемся с ошибкой:
Uncaught ReferenceError: callSomeFunc is not defined
Все остальные инструкции, которые идут после строки, на которой возникла ошибка, не выполняется. Программа заканчивает свою работу. Ситуация может показаться искуственной, поскольку мы знаем, что функция callSomeFunc
нигде не определена. Однако когда мы имеем дело с большой программой, различные куски которой определяли разные разработчики, становится сложнее контоллировать код. И таких ситуаций может быть много. Какие-то мы можем сами отследить и предупредить, а какие-то нет.
Для обработки подобных ситуаций JavaScript предоставляет конструкцию try...catch...finally
, которая имеет следующее формальное определение:
try {
инструкции блока try
}
catch (error) {
инструкции блока catch
}
finally {
инструкции блока finally
}
После оператора try
определяется блок кода. В этот блок помещаются инструкции, при выполнении которых может возникнуть потенциальная ошибка.
Затем идет оператор catch
. После этого оператора в круглых скобках указывается название объекта, который будет содержать информацию об ошибке. И далее идет блок catch
. Этот блок выполняется только при возникновении ошибки в блоке try
.
После блока catch
идет оператор finally
со своим блоком инструкций. Этот блок выполняется в конце после блока try
и catch
вне зависимости, возникла ошибка или нет.
Стоит отметить, что только блок try
является обязательным. А один из остальных блоков - catch
или finally
мы можем опустить. Однако один из этих блоков (не важно catch
или finally
) обязательно должен присуствовать. То есть мы можем использовать следующие варианты этой конструкции:
try...catch
try...finally
try...catch...finally
Например, обработаем с помощью этой конструкцию предыдущую ситуацию с несуществующей функцией:
try{
callSomeFunc();
console.log("Конец блока try");
}
catch{
console.log("Возникла ошибка!");
}
console.log("Остальные инструкции");
Итак, сначала выполняется блок try
. Однако при выполнении первой же инструкции - вызова функции callSomeFunc()
возникает ошибка. Это приведет к тому, что все последующие инструкции в блоке try
не будут выполняться. А управление перейдет к блоку catch
. В этом блоке выводится сообщение, что возникла ошибка. После выполнения блока catch
выполняются остальные инструкции программы. Таким образом, программа не прерывает свою работу при возникновении ошибки и продолжает свою работу. И в данном случае консольный вывод будет следующим:
Возникла ошибка!
Остальные инструкции
Рассмотим другой пример:
function callSomeFunc(){console.log("Функция callSomeFunc");}
try{
callSomeFunc();
console.log("Конец блока try");
}
catch(error){
console.log("Возникла ошибка!");
}
console.log("Остальные инструкции");
Теперь функция callSomeFunc()
определена в прогамме, поэтому при вызове функции ошибки не произойдет, и блок try
доработает до конца. А блок catch
при отсутствии ошибки не будет выолняться. И консольный вывод будет следующим:
Функция callSomeFunc
Конец блока try
Остальные инструкции
Получение ошибки в блоке catch
В качестве в качестве параметра в блок catch
передается объект с информацией об ошибке:
try{
callSomeFunc();
console.log("Конец блока try");
}
catch(error){
console.log("Возникла ошибка!");
console.log(error);
}
В этом случае мы получим консольный вывод на подобие следующего:
Возникла ошибка!
ReferenceError: callSomeFunc is not defined at index.html:35
Блок finally
Конструкция try
также может содержать блок finally
. Мы можем использовать этот блок вместе с блоком catch
или вместо него. Блок finally
выполняется вне зависимости, произошла ошибка или нет:
try{
callSomeFunc();
console.log("Конец блока try");
}
catch{
console.log("Произошла ошибка");
}
finally{
console.log("Блок finally")
}
console.log("Остальные инструкции");
Консольный вывод программы:
Произошла ошибка
Блок finally
Остальные инструкции