在項目開發中,肯定少不了異常的出現,作為背景開發人員,我們總是在不停的寫各種接口提供給前端調用,然而不可避免的,當背景出現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
這樣就按照我們自定義的格式傳回異常資訊了,傳回的資料結構推薦自定義傳回實體。