Skip to main content

Чи виконається finally, якщо в try є return?

Це один з найчастіших "підводних каменів" у JavaScript! Відповідь - так, блок finally завжди виконується, навіть якщо всередині try є return.


Загальне правило

Незалежно від того, чи була помилка, чи був return, чи був throw, блок finally гарантовано виконається перед виходом із функції.


Приклад 1. return усередині try

javascript
function test() { try { console.log("Всередині try"); return "Значення з try"; } finally { console.log("Блок finally все одно виконається"); } } console.log("Результат:", test());

Вивід:

javascript
Всередині try Блок finally все одно виконається Результат: Значення з try

Видно, що:

  1. Спочатку виконується код усередині try.
  2. Потім перед поверненням значення викликається finally.
  3. Лише після цього функція повертає результат.

Приклад 2. return і throw усередині try

javascript
function example() { try { console.log("Перед поверненням"); return "Повернення з try"; } catch { console.log("catch не викличеться"); } finally { console.log("finally все одно виконується"); } } console.log(example());

Вивід:

javascript
Перед поверненням finally все одно виконується Повернення з try

Приклад 3. return і помилка: finally все одно спрацьовує

javascript
function example() { try { throw new Error("Помилка в try"); } catch (e) { console.log("Впіймали:", e.message); return "Повернення з catch"; } finally { console.log("finally все одно виконується"); } } console.log(example());

Вивід:

javascript
Впіймали: Помилка в try finally все одно виконується Повернення з catch

Приклад 4. finally може перевизначити return

Якщо всередині finally теж є return, він замінить результат, який повертався з try або catch.

javascript
function example() { try { return "З try"; } finally { return "З finally"; } } console.log(example());

Вивід:

javascript
З finally

Тому додавати return у finally - погана практика, бо це робить поведінку функції непередбачуваною.


Приклад 5. Навіть при помилці finally виконається

javascript
function example() { try { throw new Error("Помилка!"); } finally { console.log("finally відпрацює навіть при помилці"); } } example(); // Uncaught Error: Помилка!

Вивід:

javascript
finally відпрацює навіть при помилці Uncaught Error: Помилка!

Підсумок

СценарійВиконається finally?Що станеться
Помилок немаєТакПісля try
Є помилкаТакПісля catch
Є return у tryТакПеред виходом із функції
Є return у catchТакПеред виходом із функції
Є throwТакПеред викидом винятку
Є return у finallyТак, і перезапише результат

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.