Посмотрите внимательно на функцию в JavaScript:
// Ветвление в блоке try/catch
function f(qwe){
try {
qwe.replace(‘3’,‘2’)
console.log(‘TRY’)
return 1
} catch (error) {
console.log(‘CATCH’)
return 2
}
};
Эта функция может принимать один параметр.
Внутри тела функции на самом верхнем уровне видимости находится блочная конструкция try/catch. Внутри блока try мы пытаемся выполнить замену символа три на символ два, предполагая что функция примет какую-то строку. Если всё хорошо, то мы получим число 1.
Если мы не передадим в вызов функции параметр, то в результате в переменной qwe будет находиться значение undefined. У него нет никаких свойств. И стало быть ни о каком replace() он ничего не знает. Такой вызов непременно создаст ошибку обращения. Из-за ошибки ситуация перейдёт в блок catch и результатом работы нашей функции будет число 2.
// Вызов без параметра
f();
// Вызов с параметром
f(‘123’);
Результаты вызовов функции f():
Магия заключается в том, что блок try|catch по факту является таким же ветвлением как и блок if|else.
Почему нужно знать о факторе ветвления для блока try|catch в JavaScript?
В попытках перехватить все возможные ошибки можно напороться на ситуацию, при которой можно просто забыть о размещении оператора внезапного прерывания return в нужном месте алгоритма функции.
Если в блоке try вам нужно было вернуть какой-то результат, то при возникновении ошибки алгоритм может пойти дальше, если забыть прописать return в блоке catch. Если мы не хотим проблем, то return должен прописывать во всех возможных блоках, включая блоки try, catch и finally.
Глубина вложенностей блоков друг в друга может серьёзно запутать даже опытного разработчика. А если кроме перехвата ошибок работают ещё блоки ветвления с if, то точно что-то потеряется.
Замечание из документации
Оператор try заключает в себе блок кода, в котором может возникнуть исключительная ситуация, например ошибка времени выполнения или оператор throw. Предложение catch предоставляет код обработки исключений. Когда предложение catch перехватывает исключение, его параметр CatchParameter привязывается к этому исключению.
Информационные ссылки
Официальная страница стандарта ECMAScript — https://tc39.es/ecma262/multipage/ — https://tc39.es/ecma262/
Раздел «The try Statement» — https://tc39.es/ecma262/#sec-try-statement