Полный цикл в digital

Конструкция 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
Остальные инструкции
Заполните форму уже сегодня!
Для начала сотрудничества необходимо заполнить заявку или заказать обратный звонок. В ответ получите коммерческое предложение, которое будет содержать индивидуальную стратегию с учетом требований и поставленных задач
Работаем по будням с 9:00 до 18:00. Заявки, отправленные в выходные, обрабатываем в первый рабочий день до 12:00.
Спасибо, ваш запрос принят и будет обработан!
Эйч Маркетинг