系統異常設計規範與原則

 

1.系統異常設計的出發點:

  1. 良好的異常信息展現,開發運維人員能快速定位問題。
  2. 響應外部調用異常時,應能明確指明是內部異常仍是調用條件不知足導至。
  3. 響應用戶操做異常時,能友好的提示用戶。

如何作到以上3點?前端

 

1.1 首先咱們須要對異常進行分類。

  1. 內部異常
    1. 資源環境致使(系統環境異常、數據庫鏈接超時、第三方服務響應超時)
    2. 第三方服務錯誤響應
    3. 第三方響應結果錯誤
    4. 外部傳入參數非法
    5. 錯誤的編碼邏輯
    6. 錯誤的配置
    7. 異常的業務數據(業務數據缺失)
  2. 業務異常
    1. 用戶操做錯誤
    2. 業務條件不知足

 

1.2 其次須要在系統中正確的捕獲這類異常,並拋出。

  1. 方法入參進行合法性驗證。
    1. 對系統外部提供的接口,是必需要進行參數驗證(必須)
    2. 系統內部對外外層提供接口,進行驗證
    3. 工具類進行參數驗證
    4. public 方法要進行驗證
    5. private 方法(不建議參數驗證)
  2. 第三方響應結果合法性驗證。
    1. 獲取第三方法結果後,根據大家的約定進行驗證。
  3. 業務處理前,對業務業務前置條件進行驗證。
    1. 業務處理前,驗證業務條件(驗證佘額、驗證這個賬戶有沒有被公安門鎖定)
    2. 要考慮性能成本(驗證身份證號碼是否是存在的)
  4. 業務處理後,對處理結果進行驗證。
    1. 驗證對方賬戶是否是到賬了,轉出賬戶是否是成功扣款
  5. 對於可能會出現異常的代碼進行 try catch 捕獲。
    1. 嘗試恢復處理
    2. 直接拋出
    3. 轉換後拋出

 

1.3 最後 在系統出口統一攔截處理。

統一攔截的目的是確保出去的異常是可控的, 調用方可以明白的異常信息。程序員

這裏出口是指系統對外統一響應邏輯,通常咱們可分三類場景數據庫

  1. WEB Response
    1. 內部異常:引導至異常提示頁。
    2. 業務異常:返回對應提示消息至前端。
    3. 未知異常:嘗試進行認別,若是認識不了,轉換成 編碼異常(BUG)。
  2. Http API 接口響應
    1. 內部異常:返回接口不可用消息。
    2. 參數錯誤:基於API文檔中的異常列表進行進行響應返回。代表參數非法,須要調用方增強參數合法性驗證
    3. 業務錯誤:基於掊口約定反回對應code與消息。
  3. RPC Service 響應
    1. 內部異常:返回服務不可用消息
    2. 參數錯誤:基於接口文檔進行響應,直接返回異常堆棧。
    3. 業務錯誤 :直接返回異常堆棧。

 

2.checkedException 與uncheckedException 聲明原則

  1. 若是是參數非法拋出,返回結果非法(即軟件BUG) uncheckedException
  2. 若是你認爲調用方程序員須要有意識地採起措施,那麼拋出檢查型異常。
  3. 程序產品有明確的條件約束的要求,可聲明檢測型業務異常

 

3.總結異常設計與處理原則

 

3.1 異常的定義技巧

  1. 基於分包表示異常的分類,不建議使用繼承
    1. 若是繼承並不能直觀的知道此異常爲何類型
    2. 業務異常能夠新建包serviceexception
    3. 系統異常能夠新建包systemexception
  2. 建立異常來類定義業務異常,不建議使用Code來定義
    1. 建議使用枚舉類型
  3. 使用枚舉來表示業務異常的幾種結果,不建議使用code

3.2 統一對異常進行分類處理

  • 異常轉換
  • 異常信息處理
  • 邏輯斷言
  • 參數合法性驗證
  • 返回結果合法性驗證

 

3.3 異常捕獲

 

3.31 統一對異常進行攔截處理運維

目的:防止不明確的異常流出系統工具

  1. RPC Service 響應攔截
  2. Web Control 響應攔截
  3. 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要帶上具體的業務數

正確方式:定義明確的業務異常

相關文章
相關標籤/搜索