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:
1let p1 = function foo(a) {
2 return new Promise((resolve, reject) => {
3 return resolve(a);
4 });
5}
6
7p1(0).then((result) => {
8 throw Error('error from then');
9 console.log("from THEN: ", result);
10})
11.catch((e) => {
12 console.log("from CATCH:", e);
13})
Output yang akan keluar kira-kira seperti berikut:
1from CATCH: Error: error from then
2 at p1.then (evalmachine.<anonymous>:8:11)
3 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:
1p1(0).then((result) => {
2 console.log("from THEN: ", result);
3})
4.catch((e) => {
5 console.log(x);
6 console.log("from CATCH:", e);
7})
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:
1p1(0).then((result) => {
2 console.log("from THEN: ", result);
3})
4.catch((e) => {
5 console.log(x);
6 console.log("from CATCH:", e);
7})
8.catch((e) => {
9 console.log("from CATCH2:", e);
10})
Bagaimana kalo kita typo lagi di block catch yang ke-2 ? ke-3 dan seterusnya ?
Lalu saya googling sedikit dan dapet solusinya, sebagai berikut.
1process.on("unhandledRejection", function(error, promise){
2 // handle error disini
3});
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