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

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