SpringBoot精通系列-如何封裝Spring Boot異常捕獲

導語
  在Spring Boot開發過程中,不難避免的就是異常處理,有些異常是通過try catch方式捕獲,或者是通過Throw直接拋出,但是這種方式的話對於客戶端是不友好的,所以希望是通過編碼的方式將這些異常進行正確的客戶端顯示,這樣就可以提升代碼可讀性,提升用戶體驗。博主做過一個項目代碼中的異常處理就是特別不友好的,面對這種狀態,就需要一個全局的異常處理。下面就來看看Spring Boot提供的全局異常處理機制

一、全局異常捕獲處理

  在Spring Boot中提供了兩個用於做全局異常處理的註解

  • @ControllerAdvice :用來開啓全局的異常捕獲
  • @ExceptionHandler : 用來說明捕獲那些異常,並且對那些異常進行處理

實例

  首先來創建一個異常處理的類,也就是說在運行時出現任何的異常都會被這個地方處理

@ControllerAdvice
public class MyExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    public String exceptionHandler(Exception e){
    	System.out.println(e)
        return e.getMessage();
    }
}


  編寫一個Controller,構造一個最簡單的異常,來查看最後的結果

@RestController
public class TestController {
    @GetMapping("/test")
    public String exception(){
        int a = 0;
        int b = 10;
        int i = b / a;
        System.out.println(i);
        return "hello";
    }
}


  返回結果

發生一個異常java.lang.ArithmeticException: / by zero

  但是這種處理機制,對於現在比較流行的前後端分離的項目,並不是太友好了,這種結果不能準確的被前端項目所使用。所以需要定義一個統一的返回結果,這樣的話對前端的小夥伴來說就比較好了。

二、統一返回結果

  封裝一個統一的Result類,如下

public class Result<T> {
    private Integer code;
    private String message;
    private T data;


    public Result(Integer code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}


三、異常處理

  首先這裏有一個需要注意的地方,在Spring Boot中默認提供了一種JSON轉化的方式。所以在使用異常的時候多出來另外一個註解

  • @RestControllerAdvice :基於RESTFul風格的異常處理結果返回。

  所以將上面的配置類轉化爲如下

@RestControllerAdvice
//@ControllerAdvice
public class MyExceptionHandler {
    @ExceptionHandler(value = SelfException.class)
    public Result<String> exceptionHandler(SelfException e){
        Result result = new Result(500,"服務器內部異常",e.getMessage());
        return result;
    }
}


  自定義異常實現

@RestController
public class TestController  {
    @GetMapping("/get")
    public String exception(){
        int i = 0;
        if (i==0){
            throw new SelfException("請求的參數是否是冪等");
        }
        i++;
        return "hello";
    }
}


  返回結果

{
    "code": 500,
    "message": "服務器內部異常",
    "data": "請求的參數是否是冪等"
}

四、404 異常處理

1、修改配置文件

  在默認情況下,Spring Boot 不會拋出404的異常,所以在正常訪問的時候並沒有在控制檯看到404的異常。可以通過配置文件來改變這個配置。


spring:
  mvc:
    throw-exception-if-no-handler-found: true  # 當發現404 異常的時候進行拋出
  resources:
    add-mappings: false   # 關閉默認資源鏈接

 Resolved [org.springframework.web.servlet.NoHandlerFoundException: No handler found for GET /test]


2、修改error跳轉路徑

  在基礎部分的時候我們瞭解過在resource目錄下面創建error的目錄,Spring Boot會自動進行映射。當然,也可以通過上面異常捕獲的方式來進行處理將頁面的錯誤請求進行處理。但是這裏需要注意,這個操作要基於ErrorController來修改,當然這種方式已經不被推薦了。

public class Error404Handler implements ErrorController {
    @Override
    public String getErrorPath() {
        return null;
    }
}

總結

  通過以下的三個註解來實現全局異常處理,當然還可以通過擴展方式來實現自定義的內容。

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