Latihan buat 08 Bug dan Error. Konsep: try/catch/finally, throw, membuat class error sendiri, dan menangkap exception tertentu saja. Jawaban di 08 Kunci Jawaban Bug dan Error.

8.1 Retry

Ada primitiveMultiply yang 20% berhasil mengalikan dan 80% melempar MultiplicatorUnitFailure. Tulis reliableMultiply(a, b) yang terus mencoba sampai berhasil, lalu mengembalikan hasilnya. Pastikan hanya menangani exception yang memang dituju.

Kode awal:

class MultiplicatorUnitFailure extends Error {}
 
function primitiveMultiply(a, b) {
  if (Math.random() < 0.2) {
    return a * b;
  } else {
    throw new MultiplicatorUnitFailure("Klunk");
  }
}
 
function reliableMultiply(a, b) {
  // tulis kodemu di sini
}
 
console.log(reliableMultiply(8, 8));
// → 64

Petunjuk: panggilan primitiveMultiply di dalam try. Di catch, kalau exception-nya bukan MultiplicatorUnitFailure, lempar ulang (throw e); kalau iya, biarkan loop mencoba lagi. Pakai loop for (;;) dengan return di dalam try. Konsep di 08 Bug dan Error > Penangkapan Selektif.

→ Jawaban: 08 Kunci Jawaban Bug dan Error > 8.1 Retry

8.2 Kotak Terkunci

Diberikan objek box berkunci: isinya cuma bisa diakses waktu terbuka. Tulis withBoxUnlocked(body) yang membuka kunci, menjalankan body, lalu memastikan kotak terkunci lagi — entah body selesai normal atau melempar exception. Bonus: kalau kotak sudah terbuka saat dipanggil, biarkan tetap terbuka.

Kode awal:

const box = new class {
  locked = true;
  #content = [];
  unlock() { this.locked = false; }
  lock() { this.locked = true; }
  get content() {
    if (this.locked) throw new Error("Locked!");
    return this.#content;
  }
};
 
function withBoxUnlocked(body) {
  // tulis kodemu di sini
}
 
withBoxUnlocked(() => box.content.push("koin emas"));
try {
  withBoxUnlocked(() => { throw new Error("Bajak laut!"); });
} catch (e) {
  console.log("Error muncul: " + e);
}
console.log(box.locked);
// → true

Petunjuk: ini kerjaan finally. Catat dulu apakah kotak awalnya terkunci; buka kalau iya; jalankan body di try; di finally kunci lagi hanya kalau awalnya terkunci. Konsep di 08 Bug dan Error > Membersihkan Setelah Exception.

→ Jawaban: 08 Kunci Jawaban Bug dan Error > 8.2 Kotak Terkunci