013-SpringBoot 定义优雅的全局异常处理方式
SpringBoot 定义优雅的全局异常处理方式
- 一、概述
- 二、定义全局异常接口
- 三、定义全局异常枚举
- 四、定义全局基础异常
- 五、定义全局基础业务异常
- 六、定义全局返回
- 七、定义全局返回工厂
- 八、全局异常处理
- 九、实体类
- 十、Controller
- 十一、效果展示
一、概述
在日常项目开发中,异常是常见的,但是如何更高效的处理好异常信息,让我们能快速定位到BUG,是很重要的,不仅能够提高我们的开发效率,还能让你代码看上去更舒服。
SpringBoot中,@RestControllerAdvice 即可开启全局异常处理,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用 @ExceptionHandler 注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。
二、定义全局异常接口
public interface IExceptionCodeMsg {
/**
* 错误码
* @return
*/
String getCode();
/**
* 错误信息
* @return
*/
String getMsg();
}
三、定义全局异常枚举
public enum PublicExceptionCodeEnum implements IExceptionCodeMsg {
// 数据操作错误定义
SUCCESS("0000", "请求成功"),
PARAM_ERROR("9001", "传入参数不正确!"),
REQUEST_FALL("9002", "请求失败,请稍后重试!"),
SYSTEM_EXCEPTION("9999", "系统请求失败"),
NO_AUTHORITY("0004", "无权限访问"),
PARAM_SQL_INJECTION_TIP("0013", "参数存在SQL注入风险"),
BODY_NOT_MATCH("0014", "请求数据格式不符"),
PARAMS_NOT_CONVERT("0015", "类型转换不对"),
;
/**
* 错误码
*/
private final String code;
/**
* 错误描述
*/
private final String msg;
PublicExceptionCodeEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public String getCode() {
return code;
}
@Override
public String getMsg() {
return msg;
}
}
四、定义全局基础异常
@Data
public class BaseException extends RuntimeException {
private static final long serialVersionUID = -4046448505794038869L;
/**
* 异常代码
*/
private String code;
/**
* 异常信息
*/
private String msg;
/**
* 参数
*/
private Object data;
/**
* 异常信息对象
*/
private Throwable cause;
protected BaseException(IExceptionCodeMsg iExceptionCodeMsg, String msg, Object data, Throwable cause) {
super(iExceptionCodeMsg.getCode(), cause);
this.setCode(iExceptionCodeMsg.getCode());
if (StrUtil.isBlank(msg)) {
this.setMsg(iExceptionCodeMsg.getMsg());
} else {
this.setMsg(msg);
}
if (cause != null) {
this.setCause(cause);
}
if (data != null) {
this.setData(data);
}
}
}
五、定义全局基础业务异常
public class BusinessBaseException extends BaseException {
private static final long serialVersionUID = -866