1.系統異常設計的出發點:
- 良好的異常信息展現,開發運維人員能快速定位問題。
- 響應外部調用異常時,應能明確指明是內部異常仍是調用條件不知足導至。
- 響應用戶操做異常時,能友好的提示用戶。
如何作到以上3點?前端
1.1 首先咱們須要對異常進行分類。
- 內部異常
- 資源環境致使(系統環境異常、數據庫鏈接超時、第三方服務響應超時)
- 第三方服務錯誤響應
- 第三方響應結果錯誤
- 外部傳入參數非法
- 錯誤的編碼邏輯
- 錯誤的配置
- 異常的業務數據(業務數據缺失)
- 業務異常
- 用戶操做錯誤
- 業務條件不知足
1.2 其次須要在系統中正確的捕獲這類異常,並拋出。
- 方法入參進行合法性驗證。
- 對系統外部提供的接口,是必需要進行參數驗證(必須)
- 系統內部對外外層提供接口,進行驗證
- 工具類進行參數驗證
- public 方法要進行驗證
- private 方法(不建議參數驗證)
- 第三方響應結果合法性驗證。
- 獲取第三方法結果後,根據大家的約定進行驗證。
- 業務處理前,對業務業務前置條件進行驗證。
- 業務處理前,驗證業務條件(驗證佘額、驗證這個賬戶有沒有被公安門鎖定)
- 要考慮性能成本(驗證身份證號碼是否是存在的)
- 業務處理後,對處理結果進行驗證。
- 驗證對方賬戶是否是到賬了,轉出賬戶是否是成功扣款
- 對於可能會出現異常的代碼進行 try catch 捕獲。
- 嘗試恢復處理
- 直接拋出
- 轉換後拋出
1.3 最後 在系統出口統一攔截處理。
統一攔截的目的是確保出去的異常是可控的, 調用方可以明白的異常信息。程序員
這裏出口是指系統對外統一響應邏輯,通常咱們可分三類場景數據庫
- WEB Response
- 內部異常:引導至異常提示頁。
- 業務異常:返回對應提示消息至前端。
- 未知異常:嘗試進行認別,若是認識不了,轉換成 編碼異常(BUG)。
- Http API 接口響應
- 內部異常:返回接口不可用消息。
- 參數錯誤:基於API文檔中的異常列表進行進行響應返回。代表參數非法,須要調用方增強參數合法性驗證
- 業務錯誤:基於掊口約定反回對應code與消息。
- RPC Service 響應
- 內部異常:返回服務不可用消息
- 參數錯誤:基於接口文檔進行響應,直接返回異常堆棧。
- 業務錯誤 :直接返回異常堆棧。
2.checkedException 與uncheckedException 聲明原則
- 若是是參數非法拋出,返回結果非法(即軟件BUG) uncheckedException
- 若是你認爲調用方程序員須要有意識地採起措施,那麼拋出檢查型異常。
- 程序產品有明確的條件約束的要求,可聲明檢測型業務異常
3.總結異常設計與處理原則
3.1 異常的定義技巧
- 基於分包表示異常的分類,不建議使用繼承
- 若是繼承並不能直觀的知道此異常爲何類型
- 業務異常能夠新建包serviceexception
- 系統異常能夠新建包systemexception
- 建立異常來類定義業務異常,不建議使用Code來定義
- 建議使用枚舉類型
- 使用枚舉來表示業務異常的幾種結果,不建議使用code
3.2 統一對異常進行分類處理
3.3 異常捕獲
3.31 統一對異常進行攔截處理運維
目的:防止不明確的異常流出系統工具
- RPC Service 響應攔截
- Web Control 響應攔截
- Http API 響應攔截
4.常見錯誤異常處理方式
直接勿略異常(不推薦):性能
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)
}
業務異不提供任何信息spa
public class DuplicateUsernameException extends Exception {
}
給每一個異常處理都定義一個Code設計
用一個統一異常替代全部業務異常(不推薦)code
public class ServiceException extends RuntimeException {
public ServiceException(Exception e) {
super(e);
}
public ServiceException(String message) {
super(message);
}
}
錯誤:1 、必須明肯定義業務異常 二、 儘量申明成checkedException 3要帶上具體的業務數
正確方式:定義明確的業務異常