Handle Error di Promise.catch()
Baru sempat baca lebih lanjut tentang error handling di Promise Javascript. Agak ketinggalan sih, karena ini masalah sudah ada dari 2 tahun-an lalu, tapi gak apa, baru fokus ke Javascript setahun terakhir, dan anyway agak susah juga cari artikel yang bahas ini pake Bahasa Indonesia jadi saya tulis aja disini.
Mungkin teman-teman pernah dengar, kalo kita throw
-ing error di resolve
function atau di then
function, maka Error itu akan otomatis menjadi Rejection ? Contoh:
let p1 = function foo(a) {
return new Promise((resolve, reject) => {
return resolve(a);
});
}
p1(0).then((result) => {
throw Error('error from then');
console.log("from THEN: ", result);
})
.catch((e) => {
console.log("from CATCH:", e);
})
Output yang akan keluar kira-kira seperti berikut:
from CATCH: Error: error from then
at p1.then (evalmachine.<anonymous>:8:11)
at <anonymous>
Artinya, tidak perlu khawatir jika ada typo atau programmer error yang lain di block function then
.
Pada awalnya saya kira then
-catch
ini sama dengan try
-catch
. Ternyata nggak sama sekali. Baru saya ketahui setelah saya test error di block catch
:
p1(0).then((result) => {
console.log("from THEN: ", result);
})
.catch((e) => {
console.log(x);
console.log("from CATCH:", e);
})
Yang saya harapkan adalah muncul ReferenceError: x not defined
. Tetapi nggak, malah silent error. Dan ini bahaya sekali. Kenapa silent Error ? Ini by design, karena setiap error akan otomatis jadi Rejection
dan di teruskan ke resolver/rejector selanjutnya, maka kita harus menambah block catch
lagi:
p1(0).then((result) => {
console.log("from THEN: ", result);
})
.catch((e) => {
console.log(x);
console.log("from CATCH:", e);
})
.catch((e) => {
console.log("from CATCH2:", e);
})
Bagaimana kalo kita typo lagi di block catch yang ke-2 ? ke-3 dan seterusnya ?
Lalu saya googling sedikit dan dapet solusinya, sebagai berikut.
process.on("unhandledRejection", function(error, promise){
// handle error disini
});
Kita bisa menuliskan kode diatas sebelum kode javascript kita yang lainnya. Sekian.
Referensi: http://jamesknelson.com/are-es6-promises-swallowing-your-errors/ https://gist.github.com/benjamingr/0237932cee84712951a2 https://stackoverflow.com/questions/29689143/trap-when-js-unhandled-rejections/29689261