Обработка ошибок

Конструкция try..catch..finally

Последнее обновление: 24.10.2023

В процессе работы прогаммы могут возникать различные ошибки, которые нарушают привычный ход программы и даже заставляют ее прервать выполнение. Язык 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
Остальные инструкции

Если мы уберем блок catch и оставим только блок finally, то ошибка не будет обработана, и программа завершится ошибкой. Однако блок finally все равно выполнится:

try{
	callSomeFunc();
	console.log("Конец блока try");
}
finally{
	console.log("Блок finally")
}

console.log("Остальные инструкции");

Консольный вывод программы:

Блок finally
Uncaught ReferenceError: callSomeFunc is not defined
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850