spring cloud腳手架項目(六)spring boot全局異常捕獲處理

前言

上一章我們說了全局的aop日誌處理和追蹤UUID日誌打印。這一節講的是全局的異常捕獲。代碼中再也不需要填入無數的try catch這種無效代碼來進行異常捕獲,去拋出,返回對應的Spring mvc結果。都可以通過這節的代碼來解決
參考博客:https://www.cnblogs.com/xuwujing/p/10933082.html

代碼

BaseException 自定義異常

public class BaseException extends RuntimeException {
    private static final long serialVersionUID = -4939515770813597146L;
    /**
     * 所屬模塊
     */
    private String module;

    /**
     * 錯誤碼
     */
    private String code;

    /**
     * 錯誤碼對應的參數
     */
    private Object args;

    /**
     * 錯誤消息
     */
    private String message;

    public BaseException(){}

    public BaseException(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public BaseException(String module, String code, String message) {
        this.module = module;
        this.code = code;
        this.message = message;
    }

    public BaseException(String module, String code, Object args, String message) {
        this.module = module;
        this.code = code;
        this.args = args;
        this.message = message;
    }

    public String getModule() {
        return module;
    }

    public String getCode() {
        return code;
    }

    public Object getArgs() {
        return args;
    }

    @Override
    public String getMessage() {
        return message;
    }
}

Sprin mvc通用返回類。

public class ResultReturn<T> {
    private String code;
    private String msg;
    private T data;

    public ResultReturn() {
    }

    public ResultReturn(String code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public ResultReturn(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public static <T> ResultReturn<T> createResult(ResultReturnEnum resultReturnEnum, T data) {
        return new ResultReturn(resultReturnEnum.getCode(), resultReturnEnum.getMessage(), data);
    }

    public static <T> ResultReturn<T> createResult(String code, String message, T data) {
        return new ResultReturn(code, message, data);
    }

    public static <T> ResultReturn<T> success() {
        return createResult(ResultReturnEnum.SUCCESS, null);
    }

    public static <T> ResultReturn<T> success(T data) {
        return createResult(ResultReturnEnum.SUCCESS, data);
    }

    public static <T> ResultReturn<T> error() {
        return createResult(ResultReturnEnum.ERROR, null);
    }

    public static <T> ResultReturn<T> customError(ResultReturnEnum resultReturnEnum) {
        return createResult(resultReturnEnum, null);
    }

    public static <T> ResultReturn<T> customError(String code, String message) {
        return createResult(code, message, null);
    }

    public static <T> ResultReturn<T> customError(ResultReturnEnum resultReturnEnum, T data) {
        return createResult(resultReturnEnum, data);
    }

    public static <T> ResultReturn<T> customError(String code, String message, T data) {
        return createResult(code, message, data);
    }
}

ResultReturnEnum返回異常的枚舉類

public enum ResultReturnEnum {
    SUCCESS("200","成功"),
    ERROR("500","系統異常"),
    ;
    private String code;
    private String message;

    ResultReturnEnum(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

}

Spring mvc全局異常處理,只針對@controller註解下的類

import com.chen.common.exception.BaseException;
import com.chen.common.result.ResultReturn;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
@Slf4j
@ResponseBody
public class WebExceptionHandler {
    /**
     * 處理自定義的業務異常
     * HandlerMethod method這個參數可以獲得一些方法的額外信息
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = BaseException.class)
    public ResultReturn bizExceptionHandler(BaseException e) {
        log.info("basic error,module:{},errorCode:{},errorMessage:{}", e.getModule(), e.getCode(), e.getMessage());
        return ResultReturn.customError(e.getCode(), e.getMessage());
    }

    /**
     * 處理其他異常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResultReturn exceptionHandler(Exception e) {
        log.info("wow,unknow erroro happen", e);
        return ResultReturn.error();
    }
}

說明

這樣我們的springmvc全局異常類就好了。我們會把全局的異常分別歸類爲已知異常和未知異常。當發生已知異常時,直接記錄異常日誌即可,當發生未知異常,需要不僅僅記錄異常日誌,還要打印對應的堆棧信息。
然後我們的WebExceptionHandler類會捕獲這些發生的異常,然後在http請求後直接返回我們需要返回的json形式的返回值。
但是還是有一個缺點。就是mq這種不是http的請求的日誌捕獲還是的自己進行

結尾

github:https://github.com/alex9567/SpringCloudScaffold

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章