Обработка ошибок Javascript с помощью try.. catch.. наконец
У меня есть подозрение, что я неправильно использую блок finally
, и что я не понимаю основы его цели...
function myFunc() {
try {
if (true) {
throw "An error";
}
} catch (e) {
alert (e);
return false;
} finally {
return true;
}
}
Эта функция будет запускать блок catch
, предупреждение "Ошибка", но затем вернуть значение true. Почему он не возвращает false?
Ответы
Ответ 1
В блоке finally содержатся инструкции для выполнения после выполнения блоков try и catch, но перед операторами, которые следуют за инструкцией try... catch. Блок finally выполняет то, генерируется ли исключение. Если выбрано исключение, операторы в блоке finally выполняются, даже если никакой блок catch не обрабатывает исключение. подробнее
Блок finally
всегда будет запущен, попробуйте вернуть true
после блока try
function myFunc() {
try {
if (true) {
throw "An error";
}
return true;
} catch (e) {
alert (e);
return false;
} finally {
//do cleanup, etc here
}
}
Ответ 2
Наконец, блоки выполняются, когда вы покидаете блок try. В вашем коде это происходит, когда вы возвращаете false. Это устанавливает для возвращаемого значения значение false и пытается выйти из функции. Но сначала он должен выйти из блока try, который запускает окончательно и перезаписывает возвращаемое значение в true.
Многие считают хорошей практикой программирования иметь один оператор возврата для каждой функции. Подумайте о создании var retval в начале вашей функции и установлении его истинным или ложным по мере необходимости во всей вашей функции, а затем структурирования кода, чтобы он попадал правильно до одного возврата внизу.
Ответ 3
function getTheFinallyBlockPoint(someValue) {
var result;
try {
if (someValue === 1) {
throw new Error("Don't you know that '1' is not an option here?");
}
result = someValue
} catch (e) {
console.log(e.toString());
throw e;
} finally {
console.log("I'll write this no matter what!!!");
}
return result;
};
getTheFinallyBlockPoint("I wrote this only because 'someValue' was not 1!!!");
getTheFinallyBlockPoint(1);
Запустите это на консоли своего браузера, и он может дать вам ответ, который вы ищете.