Обработка ошибок JavaScript с помощью try .. catch .. finally
У меня есть подозрение, что я использую finally
блокировать неправильно, а то я не понимаю основ его назначения...
function myFunc() {
try {
if (true) {
throw "An error";
}
} catch (e) {
alert (e);
return false;
} finally {
return true;
}
}
Эта функция будет запускать catch
block, вывести предупреждение "Ошибка", но затем вернуть true. Почему он не возвращает ложь?
3 ответа
Блок 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
}
}
Наконец, блоки выполняются, когда вы покидаете блок try. В вашем коде это происходит, когда вы возвращаете false. Это устанавливает возвращаемое значение в false и пытается выйти из функции. Но сначала он должен выйти из блока try, который запускает finally и перезаписывает возвращаемое значение на true.
Многие считают хорошей практикой программирования иметь один оператор return для каждой функции. Подумайте о том, чтобы сделать var retval в начале вашей функции и установить для него значение true или false в зависимости от ситуации в вашей функции, а затем структурировать код так, чтобы он правильно проваливался до одного возврата внизу.
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);
Запустите это на консоли вашего браузера, и он может дать вам ответ, который вы ищете.