1.概述
在日常开发中,如何快速定位异常并处理异常,体现了一个研发人员解决问题的能力,需要不断在业务发展中精进自己的业务水平,提升对原理的理解。快速解决的前提是快速定位问题,合理的异常处理能够帮助我们快速抛出问题。在SpringBoot中,全局异常处理能够有效降低异常代码数量,提供统一的异常处理模式,帮助我们从代码层面优雅地抛出异常。本文将演示SpringBoot中全局异常使用,并进行原理分析。
2.全局异常处理器
2.1 定义错误枚举类
随着业务的不断发展,系统可能会变得越来约庞大,可能产生和处理的异常就会逐渐增多,统一的异常文档说明必不可少,它能有效提供异常描述,进而进行异常定位。在JAVA语言中,通常采用枚举类统一定义异常编码与说明,如下图所示:
public enum ExceptionEnum {
// 数据操作错误定义
SUCCESS("2000", "成功!"),
CODE_8001("8001", "Service unavailable"),
CODE_8002("8002", "JSON exception"),
CODE_8003("8003", "Parameter is invalid"),
CODE_8004("8004", "Db error"),
CODE_8005("8005", "{0}参数不能为空"),
BODY_NOT_MATCH("4000", "请求的数据格式异常:{0}"),
SIGNATURE_NOT_MATCH("4001", "请求的数字签名不匹配:{0}"),
NOT_FOUND("4004", "未找到该资源:{0}"),
INTERNAL_SERVER_ERROR("5000", "服务器内部错误:{0}"),
SERVER_BUSY("5003", "服务器正忙,请稍后再试:{0}");
private final String errorCode;
private final String errorMsg;
ExceptionEnum(String errorCode, String errorMsg) {
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public String getCode() {
return this.errorCode;
}
public String getErrorMsg() {
return this.errorMsg;
}
}
2.2 自定义异常类
自定义异常类可以定义异常返回码与返回内容,方便在处理异常时能够快速理解异常内容,定位异常原因,代码如下:
@Slf4j
public class BaseException extends RuntimeException {
private Object[] args;
private ExceptionEnum exceptionEnum;
public BaseException() {
}
public BaseException(String message, Throwable t) {
super(message, t);
}
public Object[] getArgs() {
return args;
}
public void setArgs(Object[] args) {
this.args = args;
}
public ExceptionEnum getErrorCode() {
return exceptionEnum;
}
public void setErrorCode(ExceptionEnum errorCode) {
this.exceptionEnum = errorCode;
}
public BaseException(ExceptionEnum errorCode, Object... args) {
this.exceptionEnum = errorCode;