Springboot2:簡單的對自定義異常進行處理
阿新 • • 發佈:2019-05-03
當我們需要對應不同的異常問題返回給前端不同的提示語時,我們通常會痛苦不堪,手忙腳亂。有的人甚至在裡層根據情況返回int狀態碼,再在外層使用switch進行判斷,但其實正常的思路應該是利用Spring的異常處理機制。
1.自定義異常類
1.1.定義基類
首先,假設我們在管理一個城市,現在正在搭建一個遊樂場,我們要新增一個遊樂場的資訊。他可能出現的所有錯誤都可以認為是:
@Data public class AddAmusementParkException extends Exception { private String responseCode = ResponseCode.ADD_PARK_FAILURE; public AddAmusementParkException() { // 如果沒有指定響應碼,預設使用最廣的新增遊樂園失敗的響應碼。 } public AddAmusementParkException(String responseCode) { this.responseCode = responseCode; } }
1.2.定義一個子類
假如城市中已經有一個遊樂園叫“恆寶樂園”,又有一個地產商人不懷好意地申請叫“恆寶樂園”,我們應該義正言辭地拒絕,所以我們定義一個該異常類的子類:
public class AddAmusementParkNameRepeatException extends AddAmusementParkException {
public AddAmusementParkNameRepeatException() {
super(ResponseCode.PARK_NAME_EXIST);
}
}
2.異常處理類
我們處理這一類異常時,可以單獨定義一個處理器,比如遊樂園異常處理器:
@Slf4j
@RestControllerAdvice
public class ParkExceptionHandle {
@ExceptionHandler(value = AddAmusementParkException.class)
@ResponseBody
public DataResponse handle(AddAmusementParkException e) {
return new I18nResponse(e.getResponseCode());
}
}
如果你不想定義很多類,你可以通過一個來處理所有的異常:
@ControllerAdvice
public class ExceptionHandle {
private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public Result handle(Exception e) {
if (e instanceof MyException) {
MyException myException = (MyException) e;
return ResultUtil.error(boyException.getCode(), boyException.getMessage());
}else {
logger.error("【系統異常】{}", e);
return new Result(-1, "未知錯誤");
}
}
}
3.使用舉例
當我們使用了這些異常的時候,大概是下面這樣的:
@PostMapping("/addPark")
public DataResponse addPark(HttpServletRequest request, @RequestBody AddParkQO qo)
throws AddAmusementParkException {
I18nResponse response= new I18nResponse(ResponseCode.OK);
parkService.addPark(qo);
return response;
}