Error adalah masalah yang muncul waktu kode sedang jalan, misalnya teks data yang rusak. Kalau dibiarkan, satu error menghentikan semua kode sesudahnya. try...catch menangkap error itu, jadi kamu yang menentukan apa yang terjadi, dan programnya tetap lanjut.
🧪 Tebakan cepat: di dalam
try, baris pertama melempar error. Apa baris kedua ditryitu masih jalan? Tebak dulu, jawabannya ada di bagian "Tangkap error dengantry...catch".
Tangkap error dengan try...catch
function loadProfile(text) {
try {
const user = JSON.parse(text)
if (!user.name) {
throw new Error('name wajib diisi')
}
console.log('Halo, ' + user.name)
} catch (error) {
console.log(error.name + ': ' + error.message)
} finally {
console.log('Loader disembunyikan')
}
}
loadProfile('{"name":"Budi"}')
console.log('Program lanjut')
try { ... }berisi kode yang mungkin gagal. Begitu satu baris melempar error, sisa baris ditrydilewati dan JavaScript langsung lompat kecatch.JSON.parse(text)mengubah teks berformat JSON (format teks buat data, dibahas di materi berikutnya) jadi object. Kalau teksnya rusak, dia melemparSyntaxError.throw new Error('...')melempar error buatan kamu sendiri, dengan pesan di dalam kurung.catch (error) { ... }cuma jalan kalau ada error.error.nameberisi jenisnya (SyntaxError,Error),error.messageberisi pesannya.finally { ... }selalu jalan, ada error atau gak. Cocok buat beres-beres, misalnya menyembunyikan loader.
Dengan '{"name":"Budi"}', yang tercetak Halo, Budi, Loader disembunyikan, lalu Program lanjut. Dengan '{}', name-nya gak ada, jadi throw jalan dan baris Halo dilewati. Yang tercetak Error: name wajib diisi, Loader disembunyikan, Program lanjut. Jawaban tebakan: gak, baris sesudah error di try gak jalan.
Tanpa catch, error-nya lolos keluar fungsi. finally tetap jalan, tapi Program lanjut gak pernah tercetak.
Kembalikan nilai cadangan dari catch
return boleh ditulis di dalam try dan di dalam catch. Kalau try berhasil, nilainya dari try. Kalau gagal, dari catch:
function bacaData(teks) {
try {
return JSON.parse(teks)
} catch (error) {
return null
}
}
bacaData('{"kota":"Bandung"}') // { kota: 'Bandung' }
bacaData('[1,2,3]') // [1, 2, 3]
bacaData('kota Bandung') // null
bacaData('') // null
Biarkan JSON.parse yang menilai teksnya, jangan cek sendiri pakai teks.startsWith('{'). Array [1,2,3] juga JSON yang sah. Teks kosong '' dan object yang terpotong '{"kota":' bukan JSON, jadi dua-duanya bikin JSON.parse melempar error.
Lempar error sendiri dengan throw
JavaScript gak menganggap semua hal aneh sebagai error. 10 / 0 misalnya, hasilnya Infinity, bukan error. Kalau kamu mau itu dianggap salah, cek sendiri lalu lempar error:
function hitungDiskon(persen) {
if (persen > 100) {
throw new Error('Diskon maksimal 100 persen')
}
return persen / 100
}
try {
hitungDiskon(150)
} catch (error) {
console.log(error.message) // Diskon maksimal 100 persen
}
- Begitu
throwjalan, fungsinya berhenti di situ, jadireturndi bawahnya gak tersentuh. - Pemanggilnya menangkap error itu dengan
catch.error.messageberisi teks yang kamu tulis, huruf demi huruf, jadi satu tanda seru tambahan sudah bikin pesannya beda. - Selalu lempar
new Error('...').throwbisa melempar apa aja:throw 'oops'melempar string biasa, jadi dicatchnilaitypeof eadalah"string"dane.messagejadiundefined.
⚠️ Jebakan yang sering ketemu
catchkosong.catch (error) {}bikin error hilang diam-diam dan bug-nya susah dilacak. Minimal catat pakaiconsole.error(error).- Satu
tryraksasa. Bungkus cuma bagian yang memang bisa gagal, biar kamu tahu error-nya datang dari mana. - Error dari
fetchtanpaawait.try...catchbaru menangkap error dari Promise kalau kamu pakaiawaitdi dalamnya. Ini dibahas di materi async/await.
TL;DR: try berisi kode yang mungkin gagal, catch (error) jalan kalau ada error (pesannya di error.message), dan finally selalu jalan. Baris sesudah error di try dilewati, dan error yang gak ditangkap menghentikan sisa program. return di catch memberi nilai cadangan, misalnya null. Lempar error sendiri pakai throw new Error('pesan'), bukan throw 'pesan'.