Узнайте, как try-catch-finally будет выполняться в JavaScript
try-catch-finally используется для обработки ошибок времени выполнения и предотвращения их остановки выполнения программы.
1. Оператор возврата внутри блока try или catch
Если у нас есть блок finally
, оператор return
внутри блока try
и catch
не выполняется. Он всегда будет попадать в блок finally
.
function test() { try { return 10; } finally { console.log("finally"); return 1; } } console.log( test() ); // finally 1
Пример 2:
function test() { try { return 10; throw "error"; // this is not executed, control goes to finally } catch { console.log("catch"); return 1; } finally { console.log("finally"); return 1000; } } console.log( test() ); // finally 1000
2. Переменные, объявленные внутри блока try, недоступны в блоке catch или finally.
Если мы используем let
или const
для объявления переменной в блоке try
, она не будет доступна для catch
или finally
. Это потому, что эти объявления переменных имеют блочную область видимости.
try { let a = 10; throw "a is block scoped "; } catch(e) { console.log("Reached catch"); console.log(a); // Reference a is no defined }
Но если мы используем var
вместо let
или const
, тогда он будет доступен внутри catch
, потому что var
является областью действия функции, и объявление будет поднято.
try { var a = 10; throw "a is function scoped "; } catch(e) { console.log("Reached catch"); console.log(a); // 10 }
3. Поймать без сведений об ошибке
В ES2019 аргумент для блока catch
необязателен.
try { // code with bug; } catch { // catch without exception argument }
4. попробуй… улов не получится на setTimeOut
Если исключение происходит в «запланированном» коде, например setTimeout
, try..catch
его не поймает.
function callback() {
// error code
}
function test() {
try {
setTimeout( callback , 1000);
} catch (e) {
console.log( "not executed" );
}
}
Чтобы справиться с этим, нам нужно добавить try…catch
в обратный вызов setTimeOut
:
function callback() {
try {
// error code
}catch
console.log("Error caught") ;
}
}
function test() {
setTimeout(callback, 1000);
}
5. Добавление глобального обработчика ошибок.
Мы можем зарегистрировать window.onerror
прослушиватель событий, который будет запускаться в случае неперехваченной ошибки. Это не обработает ошибку, а обнаружит ее - вам нужно будет указать свой собственный try…catch
внутри нее.
window.onerror = function(e) { console.log("error handled", e); } function funcWithError() { a; // a is not defined } function test() { funcWithError(); console.log("hi"); // this will not be executed } test();
Подпишитесь на Javascript Jeep🚙💨.