Lompat ke konten
Kembali ke modul

JavaScript: Bahasanya · 12/12

Error dan cara menanganinya

throw, try/catch, dan bedanya error yang kamu tangani dengan error yang tidak boleh kamu telan.

Baca 25 menit

Setelah pelajaran ini kamu bisa

  • Melempar error yang memberi tahu orang berikutnya apa yang salah
  • Memakai `try`/`catch`/`finally` dengan benar
  • Menjelaskan kenapa menelan error lebih buruk daripada crash
  • Menangani error dari kode asinkron

Error bukan kegagalan kodemu — error adalah cara kodemu melaporkan bahwa terjadi sesuatu yang tidak bisa ia tangani. Kalau ditangani baik, ia jadi alat debug terbaikmu. Kalau ditangani buruk, ia menyembunyikan justru masalah yang perlu kamu lihat.

Melempar error

Coba sendiri

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Message yang baik menyebutkan apa yang diharapkan, apa yang datang, dan idealnya operasi mana yang gagal. "Input tidak valid" tidak membantu siapa pun. "nights must be a positive integer, received: 0" memberi tahu orang berikutnya persis apa yang harus diperbaiki — dan orang itu biasanya kamu sendiri, tiga bulan kemudian.

Tipe error bawaan

TipeArtinya
TypeErrorSebuah value salah tipe — jauh paling umum
ReferenceErrorSebuah nama tidak ada di scope
SyntaxErrorKodenya sama sekali tidak bisa di-parse
RangeErrorSebuah angka di luar rentang yang dibolehkan
ErrorBasis umumnya — cukup untuk error yang kamu lempar sendiri

try, catch, finally

Coba sendiri

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

finally untuk pembersihan yang harus terjadi apa pun hasilnya: menutup file, melepas lock, menghentikan spinner. Ia tetap jalan bahkan kalau block try sudah return.

Aturan untuk menangkap error

Tangkap error hanya kalau kamu benar-benar bisa melakukan sesuatu terhadapnya: memberi nilai default, mencoba ulang, atau menambah konteks lalu melemparnya lagi. Kalau tidak bisa, biarkan ia naik ke pihak yang bisa.

Coba sendiri

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Error di kode async

try/catch hanya menangkap apa yang terjadi di dalamnya, secara sinkron. Callback yang jalan nanti lolos sepenuhnya darinya. Ini jembatan ke modul berikutnya.

Coba sendiri

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Tugas praktik

Tulis safeJsonParse(text, fallback) yang mengembalikan value hasil parse, atau fallback kalau teksnya bukan JSON valid — dan mencatat satu baris peringatan yang menyebutkan masalahnya. Lalu tulis mustParse(text) yang justru melempar Error dengan message berisi 20 karakter pertama input yang bermasalah, dan menyimpan error aslinya sebagai cause.

Hasil yang diharapkan

Fallback untuk input buruk; throw deskriptif dari mustParse dengan cause tetap ada.

Tampilkan contoh solusi

Coba dulu minimal sepuluh menit sebelum membuka ini. Bagian yang terasa susah itu justru yang mengajari kamu.

function safeJsonParse(text, fallback) {
  try {
    return JSON.parse(text);
  } catch (error) {
    console.warn("safeJsonParse failed:", error.message);
    return fallback;
  }
}

function mustParse(text) {
  try {
    return JSON.parse(text);
  } catch (error) {
    const preview = String(text).slice(0, 20);
    throw new Error('invalid JSON starting with: "' + preview + '"', { cause: error });
  }
}

console.log(safeJsonParse("{}", { a: 1 }));
console.log(safeJsonParse("nope", { a: 1 }));

try {
  mustParse("definitely not json at all");
} catch (error) {
  console.log(error.message);
  console.log("cause:", error.cause.constructor.name);
}