JavaScript | Ветвление в блоке try/catch

JavaScript | Ветвление в блоке try/catch

Посмотрите внимательно на функцию в 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 создаёт ветвление в JavaScript
Блок try catch создаёт ветвление в JavaScript

Магия заключается в том, что блок try|catch по факту является таким же ветвлением как и блок if|else.

 

Почему нужно знать о факторе ветвления для блока try|catch в JavaScript?

В попытках перехватить все возможные ошибки можно напороться на ситуацию, при которой можно просто забыть о размещении оператора внезапного прерывания return в нужном месте алгоритма функции.

Если в блоке try вам нужно было вернуть какой-то результат, то при возникновении ошибки алгоритм может пойти дальше, если забыть прописать return в блоке catch. Если мы не хотим проблем, то return должен прописывать во всех возможных блоках, включая блоки try, catch и finally.

Глубина вложенностей блоков друг в друга может серьёзно запутать даже опытного разработчика. А если кроме перехвата ошибок работают ещё блоки ветвления с if, то точно что-то потеряется.

 

Замечание из документации

Оператор try заключает в себе блок кода, в котором может возникнуть исключительная ситуация, например ошибка времени выполнения или оператор throw. Предложение catch предоставляет код обработки исключений. Когда предложение catch перехватывает исключение, его параметр CatchParameter привязывается к этому исключению.

The try Statement Manual from ECMAScript Standard
The try Statement Manual from ECMAScript Standard

 

Информационные ссылки

Официальная страница стандарта ECMAScripthttps://tc39.es/ecma262/multipage/https://tc39.es/ecma262/

Раздел «The try Statement» — https://tc39.es/ecma262/#sec-try-statement