前言
之前讀大學的時候,在學校寫項目比較喜歡用到try-catch去捕獲異常,面試的時候面試官問我是怎麼處理異常的,我還是比較直白的說出只是簡單採用try-catch去實現。 但是之後有時候寫Controller層的時候如果一個個拋會比較麻煩,現在在學習到異常處理的,爲了讓代碼更容易維護,我創建一個類集中處理異常,上網查了下發現可以用 @RestControllerAdvice + @ExceptionHandler 兩個註解去實現簡單的全局異常捕獲。
一、首先還是先來點理論性的東西
@RestControllerAdvice是用於全局代碼異常捕獲,異常集中處理,更好的使業務邏輯與異常處理剝離開,與ControllerAdvice區別在於返回的數據是JSON字符串,同時跟RestController不太一樣。
@ExceptionHandler是統一處理某一類異常,從而能夠減少代碼重複率和複雜度,value值表示要捕捉的異常,可以寫多個,然後根據異常,就可以在這個方法裏面進行處理。
1. 這是整個異常類處理的代碼,裏面返回的Result實體是我自己定義的實體類
StatusCode.ERROR 也是自己定義的一個字符串,其實就是狀態碼,可自行定義。
BaseExceptionHandler.java
/**
* 統一異常處理
* Created by yhj on 2019/1/24.
*/
@RestControllerAdvice
public class BaseExceptionHandler {
/**
* 全局異常捕獲處理
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
public Result error(Exception e){
e.printStackTrace();
return new Result(false, StatusCode.ERROR, e.getMessage());
}
}
2. 這裏是Result實體類的代碼,Result.java
package entity;
/**
* Created by yhj on 2019/1/24.
*/
public class Result {
private boolean flag;
private Integer code;
private String message;
private Object data;
public Result() {
}
public Result(boolean flag, Integer code, String message) {
this.flag = flag;
this.code = code;
this.message = message;
}
public Result(boolean flag, Integer code, String message, Object data) {
this.flag = flag;
this.code = code;
this.message = message;
this.data = data;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
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 Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
3. 寫到這裏,其實這個簡單的demo就完成了,經過測試也沒有問題,返回的也是自己所寫的實體JSON出錯信息。