SpringBoot 2 統一異常處理過程解析

這篇文章主要介紹了SpringBoot 2 統一異常處理過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

統一異常處理相關注解介紹

@ControllerAdvice

聲明在類上用於指定該類爲控制增強器類,如果想聲明返回的結果爲 RESTFull 風格的數據,需要在聲明 @ExceptionHandler 註解的方法上同時加 上 @ResponseBody

@RestControllerAdvice

聲明在類上用於指定該類爲控制增強器類。並聲明返回的結果爲 RESTFull 風格的數據,無需在聲明@ExceptionHandler 註解的方法上加@ResponseBody

@ExceptionHandler

聲明在方法上用於指定需要統一攔截的異常。例如:@ExceptionHandler(value = Exception.class)

實戰操作

定義消息類:

定義 RESTFull 返回 JSON 數據的消息類,其中包含成員變量如下:

  • code:錯誤碼,0表示沒有異常信息。
  • message:異常提示信息。
  • date:無異常是返回具體內容信息。
public class ReturnMessage<T> {
  private Integer code;//錯誤碼
  private String message;//提示信息
  private T date;//返回具體內容
  public ReturnMessage(Integer code, String message, T date) {
    super();
    this.code = code;
    this.message = message;
    this.date = date;
  }
  //省略get and set方法  
}

** 消息類處理工具類:**

主要是用來處理成功或失敗消息處理,該工具類主要包含是3個方法 :

  1. 成功處理含實體數據
  2. 成功處理 沒有實體數據
  3. 失敗處理

具體代碼如下:

public class ReturnMessageUtil {
  /**
   * 無異常 請求成功並有具體內容返回
   * @param object
   * @return
   */
  public static ReturnMessage<Object> sucess(Object object) {
    ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",object);
    return message;
  }
  /**
   * 無異常 請求成功並無具體內容返回
   * @return
   */
  public static ReturnMessage<Object> sucess() {
    ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",null);
    return message;
  }
  /**
   * 有自定義錯誤異常信息
   * @param code
   * @param msg
   * @return
   */
  public static ReturnMessage<Object> error(Integer code,String msg) {
    ReturnMessage<Object> message = new ReturnMessage<Object>(code,msg,null);
    return message;
  }
 }

自定義異常類:

我們通過自定義系統異常類來完成校驗相關的操作,自定義系統異常類通過繼承 RuntimeException ,然後聲明名稱爲 code 的成員變量來表示不同類型異常。

主要是用於異常攔截後獲取自定義異常的 code ,並將code 設置到消息類中。

public class SbException extends RuntimeException{
  private Integer code; 
  public Integer getCode() {
    return code;
  }
  public void setCode(Integer code) {
    this.code = code;
  }  
  public SbException(Integer code,String message) {
    super(message);
    this.code = code;
  }  
}

定義統一異常攔截類:

通過聲明 @RestControllerAdvice 表示該類爲 RESTFul 風格的異常處理控制增強器類,在 handle 方法聲明 @ExceptionHandler 並在該註解中指定要攔截的異常類。具體代碼如下:

@RestControllerAdvice
public class ExceptionHandle {
  private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
  
  @ExceptionHandler(value = Exception.class)
  public ReturnMessage<Object> handle(Exception exception) {
    if(exception instanceof SbException) {
      SbException sbexception = (SbException)exception;
      return ReturnMessageUtil.error(sbexception.getCode(), sbexception.getMessage());
    }else {
      logger.error("系統異常 {}",exception);
      return ReturnMessageUtil.error(-1, "未知異常"+exception.getMessage());
    }
  }
}

測試

分別測試自定義異常和系統異常,通過 /error/custome 測試自定義異常,通過 /error/unknown 測試未知的系統異常。具體代碼如下:

@RestController
@RequestMapping("/error")
public class DemoException {  
  @GetMapping(value = "custome")
  public void customException() {
    SbException sbe = new SbException(100, "這個是自定義異常!");
    throw sbe;
  }
  @GetMapping(value = "unknown")
  public void unknownException() {
    int i = 0;
    int b = 1/i;
  }
}

測試結果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持神馬文庫。

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