一、背景
开发中可能碰到各种各样的异常,有的是可自定义的业务异常,有的是运行中不可知的异常,这就需要有个统一的处理。另外如果给前端返回乱七八糟的错误信息,前端就很难告知用户有效的信息,这就需要跟前端约定一个统一的规范,照着这个规范给出响应。
二、自定义异常错误码
首先,得自定义一些异常,这个根据自己需要添加:
/**
* 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

最低0.47元/天 解锁文章
2549

被折叠的 条评论
为什么被折叠?



