callback 和 promise 的錯誤捕獲-暗坑集錦

發表於2016-05-10

最近忙於業務開發,好久沒有更新部落格了,把最近開發中踩到的關於錯誤捕獲的坑,拿出來分享下;這些暗坑浪費了我大量的開發時間,只怪自己學識太淺。開始正文。

callback

執行 callbask.js

輸出:

總結(s):
1. try catch 只能捕獲同步丟擲的錯誤
2. 不要輕易在 callback 裡 throw 錯誤,不然容易形成兩次回撥。
3. 程式碼未捕獲的錯誤,會出現在 uncaughtException 事件上,建議做些日誌記錄;不然,假如你用了程式守護程式(如pm2等),會自動重啟應用,進而湮沒日誌。
4. promise 的錯誤捕獲又是不同的,不能想當然。

promise

執行 promise.js

輸出:

總結(s):
1. rejectionHandled 事件的觸發條件為,promise 沒有被及時 catch 到錯誤並觸發了 unhandledRejection 事件,在這之後的一段時間裡,promise 錯誤又被處理了,此時觸發 rejectionHandled,詳情見 Node-Docs-4.4.1#processeventrejectionhandled
2. uncaughtException 並不能捕獲 Promise 內丟擲的錯誤,如果開發者是從基於 callback 的 Async 轉向 Promise 的,尤其需要注意未知錯誤的捕獲。

由於歷史程式碼歷史包袱,有時我們會寫一個 promiseToCallback 的函式,類似如下程式碼:

這時候,尤其需要當心,cb 內如果丟擲錯誤,或觸發 catch 事件,導致發生兩次回撥,建議直接把 cb 的錯誤通過 try-catch 處理掉。

希望這些能讓你在開發中少踩些坑。

相關文章