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
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
| Tipe | Artinya |
|---|---|
TypeError | Sebuah value salah tipe — jauh paling umum |
ReferenceError | Sebuah nama tidak ada di scope |
SyntaxError | Kodenya sama sekali tidak bisa di-parse |
RangeError | Sebuah angka di luar rentang yang dibolehkan |
Error | Basis umumnya — cukup untuk error yang kamu lempar sendiri |
try, catch, finally
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.
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.
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 solusiSembunyikan 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);
}