mahirerrordebuggingMahir3 mnt baca

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

javascript
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:

javascript
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

javascript
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:

  1. Operasi yang memang bisa gagal (parse JSON, fetch, akses storage)
  2. 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:

javascript
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.