spring boot 全域性異常處理及自定義異常類
阿新 • • 發佈:2019-01-07
全域性異常處理:
定義一個處理類,使用@ControllerAdvice註解。
@ControllerAdvice註解:控制器增強,一個被@Component註冊的元件。
配合@ExceptionHandler來增強所有的@requestMapping方法。
例如:@ExceptionHandler(Exception.class) 用來捕獲@requestMapping的方法中所有丟擲的exception。
程式碼:
- public class GlobalDefultExceptionHandler {
- //宣告要捕獲的異常
- (Exception.class)
- public String defultExcepitonHandler(HttpServletRequest request,Exception e) {
- return “error”;
- }
- }
這樣,全域性異常處理類完畢。可以新增自己的邏輯。
然後還有一個問題,有的時候,我們需要業務邏輯時丟擲自定義異常,這個時候需要自定義業務異常類。
定義class:BusinessException ,使他繼承於RuntimeException.
說明:因為某些業務需要進行業務回滾。但spring的事務只針對RuntimeException的進行回滾操作。所以需要回滾就要繼承RuntimeException。
- public class BusinessException extends RuntimeException{
- }
然後,現在來稍微完善一下這個類。
當我們丟擲一個業務異常,一般需要錯誤碼和錯誤資訊。有助於我們來定位問題。
所以如下:
- public class BusinessException extends RuntimeException{
- //自定義錯誤碼
- private Integer code;
- //自定義構造器,只保留一個,讓其必須輸入錯誤碼及內容
- public BusinessException(int code,String msg) {
- super(msg);
- this.code = code;
- }
- public Integer getCode() {
- return code;
- }
- public void setCode(Integer code) {
- this.code = code;
- }
- }
這時候,我們發現還有一個問題,如果這樣寫,在程式碼多起來以後,很難管理這些業務異常和錯誤碼之間的匹配。所以在優化一下。
把錯誤碼及錯誤資訊,組裝起來統一管理。
定義一個業務異常的列舉。
- public enum ResultEnum {
- UNKONW_ERROR(-1,"未知錯誤"),
- SUCCESS(0,"成功"),
- ERROR(1,"失敗"),
- ;
- private Integer code;
- private String msg;
- ResultEnum(Integer code,String msg) {
- this.code = code;
- this.msg = msg;
- }
- public Integer getCode() {
- return code;
- }
- public String getMsg() {
- return msg;
- }
- }
這個時候,業務異常類:
- public class BusinessException extends RuntimeException{
- private static final long serialVersionUID = 1L;
- private Integer code; //錯誤碼
- public BusinessException() {}
- public BusinessException(ResultEnum resultEnum) {
- super(resultEnum.getMsg());
- this.code = resultEnum.getCode();
- }
- public Integer getCode() {
- return code;
- }
- public void setCode(Integer code) {
- this.code = code;
- }
- }
然後再修改一下全域性異常處理類:
- public class GlobalDefultExceptionHandler {
- //宣告要捕獲的異常
- (Exception.class)
- public <T> Result<?> defultExcepitonHandler(HttpServletRequest request,Exception e) {
- e.printStackTrace();
- if(e instanceof BusinessException) {
- Log.error(this.getClass(),"業務異常:"+e.getMessage());
- BusinessException businessException = (BusinessException)e;
- return ResultUtil.error(businessException.getCode(), businessException.getMessage());
- }
- //未知錯誤
- return ResultUtil.error(-1, "系統異常:\\n"+e);
- }
- }