1.內部異常
a.資源環境導致(系統環境異常,數據庫連接超時,第三方服務響應超時)
b.第三方服務錯誤響應
c.第三方響應結果錯誤
d.外部傳入參數非法
e.錯誤的編碼邏輯
f.錯誤的配置
g.異常的業務數據(業務數據缺失)
2.業務異常
a.用戶操作錯誤
b.業務條件不滿足
其次需要在系統中正確的捕獲這類異常,並拋出
1.方法入參進行合法性驗證
- a.對系統外部提供的接口,是必須要進行參數驗證(必須)
- b.系統內部對外層提供接口,進行驗證
- c.工具類進行參數驗證
- d.public方法要進行驗證
- e.private 方法(不建議參數驗證)
2.第三方響應結果合法性驗證
- a. 獲取第三方結果,根據約定進行驗證
3.業務處理前,對業務前置條件進行驗證
- a. 業務處理前,驗證業務條件(驗證餘額,驗證這個賬戶有沒有被公安部門鎖定)
- b.要考慮性能成本(驗證身份證號碼是不是存在的)
4.業務處理後,對處理結果進行驗證
- a.驗證對方賬戶是否到賬,轉出賬戶是否成功扣款
5.對於可能會出現異常的代碼進行try catch捕獲
- a.嘗試恢復處理
- b.直接拋出
- c.轉換後拋出
最後在系統的出口統一攔截處理。
統一攔截的目的是確保出去的異常是可控的,調用方能夠明白異常信息。
這裏出口是指系統對外統一響應邏輯,一般我們可分三類場景
1.WEB Response
- a.內部異常:導致異常提示頁。
- b.業務異常:返回對應提示消息至前端。
2.Http API 接口響應
- a.內部異常:返回接口不可用消息。
- b.參數錯誤:基於API文檔中的異常列表進行響應返回。表明參數非法,需要調用方加強參數合法性驗證
- c.業務錯誤:基於接口約定返回對應code與消息
3.RPC Service 響應
- a.內部異常:返回服務不可用消息
- b.參數錯誤:基於接口文檔進行響應,直接返回異常堆棧
- c.業務錯誤:直接返回異常堆棧
總結:定義歸類異常 捕獲異常 攔截處理異常
checkedException 與 uncheckedException聲明原則
1.如果參數非法拋出,返回結果非法(即軟件BUG)uncheckedException
2.如果你認爲調用方程序員需要有意識地採取措施,那麼拋出檢查型異常
3.程序產品有明確的條件約束,可聲明檢測型業務異常
Java 業務異常實戰
異常的定義技巧
基於分包表示異常的分類,不建議使用繼承
創建異常來類定義業務異常,不建議使用Code來定義
使用枚舉來表示業務異常的幾種結果,不建議使用code
統一對異常進行分類處理
異常轉換
異常信息處理
邏輯斷言
參數合法性驗證
返回結果合法性驗證
異常捕獲
統一對異常進行攔截處理
目的:防止不明確的異常流出系統
RPC Service 響應攔截
Web Control 響應攔截
Http API 響應攔截
常見的錯誤的異常處理方式
直接勿略異常:
try {
new String(source.getBytes(“UTF-8”), “GBK”);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
正確的處理
try {
new String(source.getBytes(“UTF-8”), “GBK”);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(“環境不支持UTF-8”,e)
}
業務異不提供任何信息
public class DuplicateUsernameException extends Exception {
}
給每個異常處理都定義一個Code
用一個統一異常替代所有業務異常
public class ServiceException extends RuntimeException {
public ServiceException(Exception e) {
super(e);
}
public ServiceException(String message) {
super(message);
}
}
錯誤:1 、必須明確定義業務異常 2、 儘可能申明成checkedException 3要帶上具體的業務數
正確方式:定義明確的業務異常