類型 | 情況 | 異常信息 | 處理方式 |
---|---|---|---|
業務異常 | 1. 操作非法 2. 參數不符 3. 權限非法 4. 資源不存在 |
給用戶準確信息,比如密碼錯誤 | 用戶處理或者打印簡單日誌 |
系統/程序異常 | 1. 網絡異常 2. 服務間調用異常 3. 數據庫異常 4. 緩存異常 5. 內存溢出 |
給開發者具體異常信息,比如數據庫連接失敗原因 | 重試,聯繫開發者或者記錄詳細堆棧 |
原則
- 只在必要使用異常的地方纔使用異常,不要用異常去控制程序的流程。慎地使用異常,異常捕獲的代價非常高昂,異常使用過多會嚴重影響程序的性能(java)。
- 切忌使用空catch塊。千萬不要使用空的catch塊,空的catch塊意味着你在程序中隱藏了錯誤和異常,並且很可能導致程序出現不可控的執行結果。如果你非常肯定捕獲到的異常不會以任何方式對程序造成影響,最好用Log日誌將該異常進行記錄,以便日後方便更新和維護。
- 異常信息放到一個單獨的文件中
- 在finally中釋放資源
- 如果客戶端可以從異常中採取行動進行恢復的,就使用checked exception,如果客戶什麼也做不了,就用unchecked exception。我指的是,不僅僅是記錄異常,還要採取措施來恢復。
- 如果自定義的異常沒有提供有用的信息的話,請不要創建它們。儘量使用編程語言定義好的異常類,而非我們自己創建的異常類。它們使我們的代碼易讀,也避免代碼消耗更多內存。
- 如果你將一個異常包裝成另一種異常時,構造一個新異常要傳遞源異常。
- 日誌中記錄詳細的異常信息。
- 記錄異常,僅記錄一次
node中異常類型
- 同步異常
try {
throw new Error('test')
} catch (e) {
console.error(e)
}
- 異步異常
// 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和添加額外信息