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));
// → 64Petunjuk: 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);
// → truePetunjuk: 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