Error Handling: try-catch-finally
Menangani error dengan elegan: try-catch-finally, throw error sendiri, dan membaca pesan error.
Program yang tidak mudah mati
Error tidak bisa dihindari: jaringan putus, data tidak valid, API berubah. Error handling yang baik membuat program gagal dengan elegan, bukan mati misterius.
try-catch-finally
try {
let data = JSON.parse(inputRusak); // mungkin error
console.log(data.nama);
} catch (error) {
console.log("Terjadi error: " + error.message);
} finally {
console.log("Blok ini selalu jalan");
}Kode berisiko masuk try. Kalau error, lompat ke catch. finally selalu jalan, cocok untuk bersih-bersih seperti mematikan loading.
Melempar error sendiri
Validasi bisa melempar error agar ditangani di satu tempat:
function bagi(a, b) {
if (b === 0) {
throw new Error("Tidak bisa dibagi nol");
}
return a / b;
}
try {
console.log(bagi(10, 0));
} catch (error) {
console.log("Error: " + error.message);
}throw menghentikan eksekusi dan "melempar" error ke catch terdekat. Tanpa try-catch, error akan menghentikan seluruh script.
Membaca error dengan benar
try {
JSON.parse("{rusak");
} catch (error) {
console.log(error.name); // "SyntaxError"
console.log(error.message); // pesan detail
console.log(error.stack); // jejak lokasi error
}error.stack menunjukkan file dan baris penyebab, sangat membantu debugging. Di console browser, error yang tidak tertangkap juga menampilkan stack trace yang bisa diklik.
Kapan tidak perlu try-catch?
Jangan bungkus semua kode dengan try-catch. Pakai untuk:
- Operasi yang memang bisa gagal (parse JSON, fetch, akses storage)
- Batas modul agar satu error tidak mematikan seluruh aplikasi
Bug pemrograman (typo, logic error) sebaiknya dibiarkan terlihat saat development agar diperbaiki, bukan disembunyikan catch.
Catatan teknis: catch tanpa parameter (catch {) legal di JavaScript modern kalau errornya tidak dipakai. Tapi untuk debugging, menangkap dan mengabaikan error tanpa logging adalah anti-pattern: error hilang tanpa jejak dan bug jadi sulit dilacak. Minimal log ke console.
Studi kasus: validasi berlapis
Gabungkan throw dengan try-catch untuk validasi bertingkat yang rapi:
function validasiUmur(input) {
let umur = Number(input);
if (Number.isNaN(umur)) throw new Error("Umur harus angka");
if (umur < 0) throw new Error("Umur tidak boleh negatif");
if (umur < 17) throw new Error("Minimal 17 tahun");
if (umur > 120) throw new Error("Umur tidak wajar");
return umur;
}
function daftar(input) {
try {
let umur = validasiUmur(input);
return "Pendaftaran berhasil, umur " + umur;
} catch (e) {
return "Gagal: " + e.message;
}
}
console.log(daftar("abc")); // "Gagal: Umur harus angka"
console.log(daftar("15")); // "Gagal: Minimal 17 tahun"
console.log(daftar("20")); // "Pendaftaran berhasil, umur 20"Tiap aturan validasi berdiri sendiri dengan pesan jelas. Penambah aturan baru tinggal tambah satu if-throw tanpa menyentuh kode lain.
Kesimpulan
try-catch untuk yang bisa gagal, throw untuk validasi yang tegas, dan jangan sembunyikan bug. Error handling yang baik membedakan aplikasi amatir dengan aplikasi profesional.