Finally чи просто код?
Порівняйте два фрагменти коду.
-
В першому використовується
finally
для виконання коду післяtry...catch
:try { виконання коду } catch (err) { обробка помилок } finally { очищення ресурсів }
-
В другому коді очищення відбувається одразу після
try...catch
:try { виконання коду } catch (err) { обробка помилок } очищення ресурсів
Очищення ресурсів потрібно виконати після роботи не залежно від наявності помилки.
Чи є якійсь переваги використання finally
, чи обидва фрагменти коду однакові? Якщо є різниця – наведіть приклади використання.
Різниця стає очевидною, якщо ми подивимося на код всередині функції.
Поведінка відрізнятиметься, якщо код «раптово вийде» з блоку try...catch
.
Наприклад, якщо всередині try...catch
є return
. Блок finally
спрацює для “будь-якого” виходу з try...catch
, навіть за допомогою return
– одразу після виходу з блоку try...catch
, але перед передачею контролю кодові, що викликав цю функцію.
function f() {
try {
alert('початок');
return "результат";
} catch (err) {
/// ...
} finally {
alert('очищення!');
}
}
f(); // очищення!
…Або якщо є throw
:
function f() {
try {
alert('початок');
throw new Error("помилка");
} catch (err) {
// ...
if("не можу обробити помилку") {
throw err;
}
} finally {
alert('очищення!')
}
}
f(); // очищення!
finally
гарантує очищення. Очищення не спрацює, якщо ми просто додамо код в кінці функції f
.