1. 程式人生 > >SpringBoot異常處理統一封裝我來做-使用篇

SpringBoot異常處理統一封裝我來做-使用篇

SpringBoot異常處理統一封裝我來做-使用篇

簡介

重複功能我來寫。在 SpringBoot 專案裡都有全域性異常處理以及返回包裝等,返回前端是帶上succcodemsgdata等欄位。單個專案情況下很好解決,當微服務模組多的情況下,很多情況開發都是複製原有程式碼進行構建另外一個專案的,導致這些功能升級需要修改多個服務,在這個基礎上,我們封裝了一個元件 unified-dispose-springboot-starter 裡面包含了一些基礎的異常處理以及返回包裝功能。

依賴新增啟動功能

新增依賴
ps: 實際version版本請使用最新版
最新版本:

點選檢視最新新版本

<dependency>
  <groupId>com.purgeteam</groupId>
  <artifactId>unified-dispose-springboot-starter</artifactId>
  <version>0.1.1.RELEASE</version>
</dependency>

啟動類新增 @EnableGlobalDispose 註解開啟以下功能。

@EnableGlobalDispose
@SpringBootApplication
public class GlobalDisposeSpringBootApplication {

  public static void main(String[] args) {
    SpringApplication.run(GlobalDisposeSpringBootApplication.class, args);
  }

}

One 異常處理⚠️

在專案中經常出現系統異常的情況,比如NullPointerException

等等。如果預設未處理的情況下,springboot會響應預設的錯誤提示,這樣對使用者體驗不是友好,系統層面的錯誤,使用者不能感知到,即使為500的錯誤,可以給使用者提示一個類似伺服器開小差的友好提示等。

模組裡以及包含了一些基本的異常處理方式(及不需要做任何程式碼編寫已經具有基本異常處理),以及一些常見的異常code,使用者只需要關心業務異常處理即可,直接通過 throw new 異常 的方式丟擲即可。

異常處理包含型別

# 通用500異常
Exception 類捕獲 500 異常處理

# Feign 異常
FeignException 類捕獲
ClientException 類捕獲

# 業務自定義
BusinessException 類捕獲 業務通用自定義異常

# 引數校驗異常
HttpMessageNotReadableException 引數錯誤異常
BindException 引數錯誤異常

程式主動丟擲異常

throw new BusinessException(BusinessErrorCode.BUSINESS_ERROR);
// 或者
throw new BusinessException("CLOUD800","沒有多餘的庫存");

通常不建議直接丟擲通用的BusinessException異常,應當在對應的模組裡新增對應的領域的異常處理類以及對應的列舉錯誤型別。

如會員模組:
建立UserException異常類、UserErrorCode列舉、以及UserExceptionHandler統一攔截類。

UserException:

@Data
public class UserException extends RuntimeException {

  private String code;
  private boolean isShowMsg = true;

  /**
   * 使用列舉傳參
   *
   * @param errorCode 異常列舉
   */
  public UserException(UserErrorCode errorCode) {
    super(errorCode.getMessage());
    this.setCode(errorCode.getCode());
  }

}

UserErrorCode:

@Getter
public enum UserErrorCode {
    /**
     * 許可權異常
     */
    NOT_PERMISSIONS("CLOUD401","您沒有操作許可權"),
    ;

    private String code;

    private String message;

    CommonErrorCode(String code, String message) {
        this.code = code;
        this.message = message;
    }
}

UserExceptionHandler:

@Slf4j
@RestControllerAdvice
public class UserExceptionHandler {

  /**
   * UserException 類捕獲
   */
  @ExceptionHandler(value = UserException.class)
  public Result handler(UserException e) {
    log.error(e.getMessage(), e);
    return Result.ofFail(e.getCode(), e.getMessage());
  }

}

最後業務使用如下:

// 判斷是否有許可權丟擲異常
throw new UserException(UserErrorCode.NOT_PERMISSIONS);

上述方式,丟擲異常後會被模組處理。前臺返回如下:

{
  "succ": false,        // 是否成功
  "ts": 1566467628851,  // 時間戳
  "data": null,         // 資料
  "code": "CLOUD800",   // 錯誤型別
  "msg": "業務異常",    // 錯誤描述
  "fail": true
}

Tow 統一返回封