系統異常設計規範與原則

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要帶上具體的業務數
正確方式:定義明確的業務異常

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章