【企业标准开发框架 01】全局异常处理+自定义异常类
是什么?
【0】 全局异常处理器(统一拦截所有的Controller抛出的异常)
- 统一拦截异常的机制,保证所有的Controller抛出的异常都可以被捕获,并且标准化的形式返回响应
- 在Spring Boot中通常使用
RestControllerAdvice + @ExceptionHandler
来实现
【1】自定义异常类(业务异常类)
- 自定义业务的异常类,用来明确表示业务的错误(如:用户不存在,余额不足)
- 通常包含
错误码+错误原因
,便于前后端协同
为什么?
为什么必须要这样做,上面已经赘述过了,就是放了方便前后端联调,方便知道是哪里的业务出现了问题!
优点:
- 统一性(如果不写比较混乱,前端无法统一处理,写了之后都是{code,message,data} )
- 安全性 (如果不写有可能会把内部堆栈、sql信息泄露给用户)
- 可维护性(方便定义问题,能够快速知道是哪个模块出现的错误,前端也可以根据错误码给出提示)
怎么做?
步骤
1.自定义业务异常类(BusinessException)
2. 定义枚举类(ErrorCodeEnum)
3. 全局异常处理类(GlobalExceptionHandler)
4. 业务中直接使用throw new BusinessException(…)
自定义业务异常类
01. 枚举类
import lombok.Data;
import lombok.Generated;
import lombok.Getter;
public enum CodeEnum {
// 通用
SUCCESS(0, "成功"),
SYSTEM_ERROR(1000, "系统异常"),
PARAM_ERROR(1001, "参数错误"),
UNAUTHORIZED(1002, "未认证或登录已过期"),
FORBIDDEN(1003, "没有权限"),
// 用户模块
USER_NOT_FOUND(2001, "用户不存在"),
USERNAME_EXISTS(2002, "用户名已存在"),
PASSWORD_ERROR(2003, "密码错误");
private final int code;
private final String message;
CodeEnum(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode(){
return code;
}
public String getMessage(){
return message;
}
}
02.自定义异常类
/**
* @author Soft
* @version 1.0
* @description: 自定义异常处理类
* @date 2025/8/22 11:44
*/
public class BusinessException extends RuntimeException {
private final int code;
/**
* @author bohai
* @description: 通过枚举构造
* @param:
* @return:
* @date: 2025/8/22 15:32
*/
public BusinessException(CodeEnum codeEnum){
super(codeEnum.getMessage());
this.code = codeEnum.getCode();
}
/**
0. 在后续的业务中直接使用就可以
throw new BusinessException(CodeEnum.USER_NOT_FOUND);
1. 为什么code使用了final?但是message却没有使用final
原因一:首先RuntimeException继承的是Exception,而Exception又继承Throwable,它里面的message是已经定义好的,而且是没有使用final的!!
原因二:是因为实际开发中通常也不会修改message,但是又拼接的情况,方便重写message和灵活高效的调试,
*/
// 直接传入错误码和信息
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
public int getCode() {
return code;
}
}
为什么message不使用final? 上述代码注释中有详细解释!
03. 统一返回体
/**
* @author hai
* @version 1.0
* @description: 统一返回体
* @date 2025/8/22 15:55
*/
@Data
public class AjaxResponse<T> extends HashMap<String, Object