Finally atau hanya kode biasa?
Bandingkan dua fragmen kode.
-
Yang pertama menggunakan
finally
untuk mengeksekusi kode setelahtry..catch
:try { work work } catch (err) { handle errors } finally { cleanup the working space }
-
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.