Springboot項目中異常攔截設計與處理

背景:

項目運行過程當中會出現各類各樣的問題,常見的有如下幾種狀況:redis

  1. 業務流程分析疏漏,對業務流程的反向操做、邊界分析設計不充分spring

  2. 調用外部服務、調用外部系統出現的超時、錯誤、返回值與預期不符數組

  3. 外部資源連通性問題,db等服務器出現的網絡抖動或宕機

    springboot

不管是分析設計、開發、測試、線上都須要可以準肯定位問題並制定解決方案。服務器

目的:

  • 規範化異常的處理過程,避免異常被吞和處處都在捕獲異常的狀況網絡

  • 準確的反饋異常信息,爲定位問題提供依據框架

  • 通用性異常全局處理,下降業務開發關注度 測試

  • 對異常狀況進行預警,以便可以及時響應編碼

1、異常規劃

1. 業務類異常

形成業務流程不能正確執行的行爲,常見的幾種:spa

  • 輸入必填驗證

  • 業務狀態約束校驗

  • 權限驗證

  • 調用外部服務返回數據不符合預期

這類異常須要給調用方返回明確的異常描述信息,通常狀況下和代碼無關,無需調整編碼

注:是業務完整性的一部分,需提早分析

2. 系統類異常

  • 服務調用異常: 超時、中斷、接口異常(非200請求)

  • 第三方異常 :db\redis\消息隊列 鏈接失敗等

注:一般與業務流程無關,與第三方系統有關,不能簡單的經過調整代碼解決

3. 通用異常

編碼不嚴謹、數據異常形成的問題,不可預測

舉例:參數類型不匹配、空指針、數組越界

2、異常攔截

在springboot中全局異常攔截處理已知的有下面2種方案:

方案1:@ControllerAdvice、實現ErrorController

      注:利用springboot自帶的攔截機制,只須要定義出處理的策略,沒有破壞springboot的約定

方案2:繼承AbstractHandlerExceptionResolver,徹底自定義處理策略

      注:使用spring中最底層的類,打破了springboot的約定,可以攔截到全部異常

 

3、方案實踐

 筆者基於方案一進行實踐。

1. 異常攔截時序圖

 

 

2. RrcRestAdvice實現代碼

2. RrcExpHandler實現代碼

注意:基於RestControllerAdvice的異常攔截只能捕獲請求達controller以後的程序異常,因此須要實現ErrorController處理以前的異常。

 

總結:

推薦基於springboot中@ControllerAdvice 和 ErrorController接口的約定,相對較符合springboot的約定。

其餘可選方案:

繼承AbstractHandlerExceptionResolver

優勢:可徹底自定義處理策略。缺點:對框架約定破壞較爲嚴重,自定義處理策略容易疏漏。

繼承HandlerInterceptorAdapter

理論上能夠處理業務代碼拋出的異常,優缺點沒有進行過驗證。

相關文章
相關標籤/搜索