kembali ke pelajaran

Finally atau hanya kode biasa?

Bandingkan dua fragmen kode.

  1. Yang pertama menggunakan finally untuk mengeksekusi kode setelahtry..catch:

    try {
      work work
    } catch (err) {
      handle errors
    } finally {
      cleanup the working space
    }
  2. Fragmen kedua melakukan pembersihan tepat setelah try..catch:

    try {
      work work
    } catch (err) {
      handle errors
    }
    
    cleanup the working space

Kita pasti membutuhkan pembersihan setelah pekerjaan, tidak masalah apakah ada kesalahan atau tidak.

Apakah ada keuntungan di sini dalam menggunakan finally atau kedua fragmen kode sama? Jika ada keuntungan seperti itu, berikan contoh ketika itu penting.

Perbedaannya menjadi jelas ketika kita melihat kode di dalam suatu fungsi.

Perilakunya berbeda jika ada lompatan keluar dari try..catch.

Misalnya, ketika ada return di dalamtry..catch. Klausa finally berfungsi jika ada ya keluar daritry..catch, bahkan melalui pernyataan return: tepat setelahtry..catch selesai, tetapi sebelum kode pemanggil mendapatkan kontrol.

function f() {
  try {
    alert('start');
    return "result";
  } catch (err) {
    /// ...
  } finally {
    alert('cleanup!');
  }
}

f(); // cleanup!

… Atau ketika ada throw, seperti di sini:

function f() {
  try {
    alert('start');
    throw new Error("an error");
  } catch (err) {
    // ...
    if("can't handle the error") {
      throw err;
    }

  } finally {
    alert('cleanup!')
  }
}

f(); // cleanup!

Bagian finally yang menjamin proses pembersihan di sini. Jika kita hanya meletakkan kode di akhir f, itu tidak akan berjalan dalam situasi ini.