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.

→ Soal: 08 Latihan Bug dan Error > 8.2 Kotak Terkunci