異常處理

類型 情況 異常信息 處理方式
業務異常 1. 操作非法
2. 參數不符
3. 權限非法
4. 資源不存在
給用戶準確信息,比如密碼錯誤 用戶處理或者打印簡單日誌
系統/程序異常 1. 網絡異常
2. 服務間調用異常
3. 數據庫異常
4. 緩存異常
5. 內存溢出
給開發者具體異常信息,比如數據庫連接失敗原因 重試,聯繫開發者或者記錄詳細堆棧

原則

  1. 只在必要使用異常的地方纔使用異常,不要用異常去控制程序的流程。慎地使用異常,異常捕獲的代價非常高昂,異常使用過多會嚴重影響程序的性能(java)。
  2. 切忌使用空catch塊。千萬不要使用空的catch塊,空的catch塊意味着你在程序中隱藏了錯誤和異常,並且很可能導致程序出現不可控的執行結果。如果你非常肯定捕獲到的異常不會以任何方式對程序造成影響,最好用Log日誌將該異常進行記錄,以便日後方便更新和維護。
  3. 異常信息放到一個單獨的文件中
  4. 在finally中釋放資源
  5. 如果客戶端可以從異常中採取行動進行恢復的,就使用checked exception,如果客戶什麼也做不了,就用unchecked exception。我指的是,不僅僅是記錄異常,還要採取措施來恢復。
  6. 如果自定義的異常沒有提供有用的信息的話,請不要創建它們。儘量使用編程語言定義好的異常類,而非我們自己創建的異常類。它們使我們的代碼易讀,也避免代碼消耗更多內存。
  7. 如果你將一個異常包裝成另一種異常時,構造一個新異常要傳遞源異常。
  8. 日誌中記錄詳細的異常信息。
  9. 記錄異常,僅記錄一次

node中異常類型

  1. 同步異常
try {
  throw new Error('test')
} catch (e) {
  console.error(e)
}
  1. 異步異常
// promise
try {
  return await asyncWork()
} catch (e) {
  console.error(e)
}
// event
const s = fs.readFile('path/of/file')
s.on('error', e => console.error(e))

node-verror

這個repo 可支持構建error chain和添加額外信息

參考

  1. 異常處理最佳實戰
  2. 系統中的業務異常
  3. Exception handling statements
  4. How to Build a Node.js Error-handling System
  5. Error MDN說明
  6. Error Handling in Node.js