Springboot自定义异常以及统一异常处理RestControllerAdvice(ControllerAdvice)

一、背景

       开发中可能碰到各种各样的异常,有的是可自定义的业务异常,有的是运行中不可知的异常,这就需要有个统一的处理。另外如果给前端返回乱七八糟的错误信息,前端就很难告知用户有效的信息,这就需要跟前端约定一个统一的规范,照着这个规范给出响应。

二、自定义异常错误码

首先,得自定义一些异常,这个根据自己需要添加:

/**
 * Description 异常错误码
 *
 * @author Bob
 * @date 2020/8/17
 **/
public final class ErrorCode {

    /**
     * 成功
     */
    public static final String SUCCESS = "000000";

    /**
     * 参数验证异常
     */
    public static final String INVALID_ARG_EXCEPTION = "000001";

    /**
     * 业务异常
     */
    public static final String BIZ_EXCEPTION = "000002";

    /**
     * 数据库异常
     */
    public static final String DAO_EXCEPTION = "000003";

    /**
     * 内部服务器错误
     */
    public static final String SERVLET_EXCEPTION = "000004";

    /**
     * DATAFLOW异常
     */
    public static final String DATAFLOW_EXCEPTION = "000005";

    /**
     * 空指针异常
     */
    public static final String NULL_POINTER_EXCEPTION = "000006";
    /**
     * 系统异常
     */
    public static final String EXCEPTION = "999999";
}

三、自定义异常

传统处理异常一般有以下烦恼:

  • 是捕获异常(try…catch)还是抛出异常(throws)
  • 是在controller层做处理还是在service层处理又或是在dao层做处理
  • 处理异常的方式是啥也不做,还是返回特定数据,如果返回又返回什么数据
  • 不是所有异常我们都能预先进行捕捉,如果发生了没有捕捉到的异常该怎么办?

以上这些问题都可以用全局异常处理来解决,全局异常处理也叫统一异常处理,全局和统一处理代表什么?代表规范!规范有了,很多问题就会迎刃而解!

抛异常的时候总不能每次都抛Exception,这里需要配置一些自定义的异常:

  • 自定义异常可以携带更多的信息,不像这样只能携带一个字符串。
  • 项目开发中经常是很多人负责不同的模块,使用自定义异常可以统一了对外异常展示的方式。
  • 自定义异常语义更加清晰明了,一看就知道是项目中手动抛出的异常。
/**
 * Description 默认异常
 *
 * @author Bob
 * @date 2020/8/17
 **/
public class DataFlowException extends RuntimeException {
    private static final long serialVersionUID = 5688133194852743474L;
    /**
     * @description 错误码
     * @author Bob
     * @date 2020/8/17
     */
    private String errCode = ErrorCode.DATAFLOW_EXCEPTION;

    public String getErrCode() {
        return errCode;
    }

    public void setErrCode(String errCode) {
        this.errCode = errCode;
    }

    /**
     * @description 构造方法
     * @author Bob
     * @date 2020/8/17
     */
    public DataFlowException(String message) {
        super(message);
    }

    /**
     * @description 构造方法
     * @author Bob
     * @date 2020/8/17
     */
    public DataFlowException(String errCode, String errMsg) {
        super(errMsg);
        this.setErrCode(errCode);
    }

    /**
     * @description 构造方法
     * @author Bob
     * @date 2020/8/17
     */
    public DataFlowException(String message, Throwable cause) {
        super(message, cause);
    }

    /**
     * @description 构造方法
     * @author Bob
     * @date 2020/8/17
     */
    public DataFlowException(String errCode, String message, Throwable cause) {
        super(message, cause);
        this.setErrCode(errCode);
    }

    /**
     * @description 构造方法
     * @author Bob
     * @date 2020/8/17
     */
    public DataFlowException(Throwable cause) {
        super(cause);
    }
}

 

/**
 * Description 业务异常
 *
 * @author Bob
 * @date 2020/8/17
 **/
public class BusinessException extends DataFlowException {
    private static final long serialVersionUID = -8609214742345497948L;

    /**
     * @param message
     * @description 构造方法
     * @author Bob
     * @date 2020/8/17
     */
    public BusinessException(String message) {
        super(message);
        setErrCode(ErrorCode.BIZ_EXCEPTION);
    }

    /**
     * @description 构造方法
     * @author Bob
     * @date 2020/8/17
     */
    public BusinessException(String errCode, String errMsg) {
        su
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值