назад до уроку

Finally чи просто код?

важливість: 5

Порівняйте два фрагменти коду.

  1. В першому використовується finally для виконання коду після try...catch:

    try {
      виконання коду
    } catch (err) {
      обробка помилок
    } finally {
      очищення ресурсів
    }
  2. В другому коді очищення відбувається одразу після 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.