egig.github.io

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

<< Previous Post

|

Next Post >>

#Javascript #Nodejs #Promise