天天看點

SpringBoot中配置全局異常處理

在項目開發中,肯定少不了異常的出現,作為背景開發人員,我們總是在不停的寫各種接口提供給前端調用,然而不可避免的,當背景出現BUG時,前端總是醜陋的講錯誤資訊直接暴露給使用者,這樣的使用者體驗想必是相當差的

先寫一個錯誤請求

@GetMapping("api/error")
    public Object error(){
        int a=10/0;
        return a;
    }
           

使用postman測試接口,結果如下

QQ截圖20180317190754.png

如果未添加全局異常處理,将會使用預設的異常處理,傳回結果,傳回的結果和自己的資料結構有很大的差異,對于前端處理傳回結果也很麻煩,是以最好可以做個全局異常處理

@ControllerAdvice 處理全局異常

在處理

controller

層抛出的自定義異常時,可以實作

@ControllerAdvice

注解捕獲。

@ExceptionHandler

:統一處理某一類異常,進而能夠減少代碼重複率和複雜度

該注解作用對象為方法,并且在運作時有效,

value()

可以指定異常類。異常參數:包括一般的異常或特定的異常(即自定義異常),如果注解沒有指定異常類,會預設進行映射。

@ControllerAdvice

:異常集中處理,更好的使業務邏輯與異常處理剝離開

全局異常處理代碼如下:

@ControllerAdvice
public class GloablExceptionHandler {
    @ResponseBody
    @ExceptionHandler(Exception.class)
    public Object handleException(Exception e) {
        // 記錄錯誤資訊
        String msg = e.getMessage();
        if (msg == null || msg.equals("")) {
            msg = "伺服器出錯";
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("message", msg);
        return jsonObject;
    }
}
           

我這裡直接用

fastjson

傳回

json

資料,也可以自定義傳回實體(比較推薦).

如果是想傳回頁面的話可以傳回

ModelAndView

的對象,并且不用加

@ResponseBody

如果全部異常處理傳回

json

,那麼可使用

@RestControllerAdvice

代替

@ControllerAdvice

,這樣在方法上就可以不需要添加

@ResponseBody

下面我們再次來看看異常的傳回

QQ截圖20180317193043.png

這樣就按照我們自定義的格式傳回異常資訊了,傳回的資料結構推薦自定義傳回實體。