1. 程式人生 > 程式設計 >Springboot之自定義全域性異常處理

Springboot之自定義全域性異常處理

本文首發至java技術部落格[碼上]:jdkcb.com/

前言:

在實際的應用開發中,很多時候往往因為一些不可控的因素導致程式出現一些錯誤,這個時候就要及時把異常資訊反饋給客戶端,便於客戶端能夠及時地進行處理,而針對程式碼導致的異常,我們一般有兩種處理方式,一種是throws直接丟擲,一種是使用try..catch捕獲,一般的話,如果邏輯的異常,需要知道異常資訊,我們往往選擇將異常丟擲,如果只是要保證程式在出錯的情況下 依然可以繼續執行,則使用try..catch來捕獲。

但是try..catch會導致程式碼量的增加,讓後期我們的程式碼變得臃腫且難以維護。當然,springboot作為一個如此優秀的框架,肯定不會坐視不管的,通過springboot自帶的註解,我們可以方便的自定義我們的全域性異常處理器,並且以json格式返回給我們的客戶端。

程式碼實戰:

捕獲全域性異常:

首先呢,我們新建我們負責全域性異常捕捉處理的類:MyControllerAdvice,程式碼如下:

@ControllerAdvice
public class MyControllerAdvice {


    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map<String,Object> exceptionHandler(Exception ex){
        Map<String,Object> map  = new HashMap<String,Object>();
        map.put("code"
,100); map.put("msg",ex.getMessage()); //這裡可以加上我們其他的異常處理程式碼,比如日誌記錄,,, return map; } } 複製程式碼

註解說明:

@ControllerAdvice 通過AOP的方式配合@ExceptionHandler()註解捕獲在Controller層面發生的異常。如果需要掃描自定路徑下的Controller,新增basePackages屬性

@ControllerAdvice(basePackages ="com.example.demo.controller")
複製程式碼

@RestControllerAdvice : 和@ControllerAdvice作用相同,可以理解為 @ResponseBody+@ControllerAdvice 的組合使用。

@ExceptionHandler():該註解作用主要在於宣告一個或多個型別的異常,當符合條件的Controller丟擲這些異常之後將會對這些異常進行捕獲,然後按照其標註的方法的邏輯進行處理,從而改變返回的檢視資訊。

測試:

@RestController
public class UserController {


    @GetMapping("/test")
    public String test(){
        int num = 1/0;
        return "Hello World";
    }


}

複製程式碼

結果:

{"msg":"/ by zero","code":100}
複製程式碼

捕獲自定義異常:

自定義我們的異常資訊類MyException 並繼承RuntimeException:

public class MyException extends RuntimeException {

    private String errorCode;
    private String errorMsg;

    public MyException(String errorCode,String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }


    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
    
}

複製程式碼

修改我們的MyControllerAdvice,將MyException新增進去:

    @ResponseBody
    @ExceptionHandler(value = MyException.class)
    public Map<String,Object> myExceptionHandler(MyException mex){
        Map<String,mex.getErrorCode());
        map.put("msg",mex.getErrorMsg());
        //其他業務程式碼...
        return map;
    }
複製程式碼

測試:

    @GetMapping("/test1")
    public String test1(){
        String name = null;
        if(name == null){
            throw new MyException("101","使用者名稱為空");
        }
        return "Hello World";
    }
複製程式碼

輸出:

{"msg":"使用者名稱為空","code":"101"}
複製程式碼

完成~,關注我,有你好果子吃,哼。