В процессе работы прогаммы могут возникать различные ошибки, которые нарушают привычный ход программы и даже заставляют ее прервать выполнение. Язык 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 передается объект с информацией об ошибке:
try{ callSomeFunc(); console.log("Конец блока try"); } catch(error){ console.log("Возникла ошибка!"); console.log(error); }
В этом случае мы получим консольный вывод на подобие следующего:
Возникла ошибка! ReferenceError: callSomeFunc is not defined at index.html:35
Конструкция try также может содержать блок finally. Мы можем использовать этот блок вместе с блоком catch или вместо него. Блок finally выполняется вне зависимости, произошла ошибка или нет. Например:
try{ callSomeFunc(); console.log("Конец блока try"); } catch{ console.log("Произошла ошибка"); } finally{ console.log("Блок finally") } console.log("Остальные инструкции");
Консольный вывод программы:
Произошла ошибка Блок finally Остальные инструкции
Если мы уберем блок catch и оставим только блок finally, то ошибка не будет обработана, и программа завершится ошибкой. Однако блок finally все равно выполнится:
try{ callSomeFunc(); console.log("Конец блока try"); } finally{ console.log("Блок finally") } console.log("Остальные инструкции");
Консольный вывод программы:
Блок finally
Uncaught ReferenceError: callSomeFunc is not defined