Kunci jawaban 08 Latihan Bug dan Error.
8.1 Retry
function reliableMultiply(a, b) {
for (;;) {
try {
return primitiveMultiply(a, b);
} catch (e) {
if (!(e instanceof MultiplicatorUnitFailure)) {
throw e;
}
}
}
}Kenapa: return di dalam try langsung keluar dari loop dan fungsi begitu berhasil. Kalau gagal dengan tipe yang diharapkan, catch gak berbuat apa-apa dan loop for (;;) mencoba lagi. Tipe error lain dilempar ulang (throw e) supaya bug asli gak tersembunyi. Perhatikan tanda kurung di !(e instanceof ...), karena !e instanceof X bakal dibaca (!e) instanceof X.
→ Soal: 08 Latihan Bug dan Error > 8.1 Retry
8.2 Kotak Terkunci
function withBoxUnlocked(body) {
let awalnyaTerkunci = box.locked;
if (awalnyaTerkunci) box.unlock();
try {
return body();
} finally {
if (awalnyaTerkunci) box.lock();
}
}Kenapa: gak ada catch di sini — fungsi ini gak mau menangani error dari body, cuma mau membersihkan. Kalau body melempar, finally tetap jalan (mengunci kotak) lalu exception-nya lanjut ke pemanggil. return body() di try juga aman: finally tetap jalan sebelum nilai dikembalikan. Mencatat awalnyaTerkunci bikin kotak yang tadinya terbuka tetap terbuka setelah selesai.