自定义异常类businessexception通过绑定业务错误枚举businesserrorcode,确保每个异常携带明确的错误码、消息及可选上下文,实现类型安全与统一错误处理;枚举含code、message等字段,异常构造时强制传入枚举实例,并提供带参重载支持动态消息填充。

自定义异常类绑定业务错误枚举 BusinessErrorCode,核心是让异常实例携带明确的业务错误码、消息和可选上下文信息,并通过构造器或工厂方法与枚举建立强关联。这样既保证类型安全,又便于统一错误处理和国际化。
定义业务错误枚举 BusinessErrorCode
枚举应包含错误码(code)、默认提示消息(message)、HTTP状态码(可选)等字段,体现业务语义:
public enum BusinessErrorCode {
USER_NOT_FOUND("USER_001", "用户不存在"),
ORDER_INVALID("ORDER_002", "订单参数不合法"),
INSUFFICIENT_BALANCE("PAY_003", "余额不足");
private final String code;
private final String message;
BusinessErrorCode(String code, String message) {
this.code = code;
this.message = message;
}
// 提供 getter,避免暴露内部结构
public String getCode() { return code; }
public String getMessage() { return message; }
}
创建自定义异常类并关联枚举
异常类持有一个 BusinessErrorCode 实例,在构造时强制传入,确保每个异常都有明确的业务含义:
public class BusinessException extends RuntimeException {
private final BusinessErrorCode errorCode;
// 必须通过枚举构造,杜绝随意传码
public BusinessException(BusinessErrorCode errorCode) {
super(errorCode.getMessage());
this.errorCode = errorCode;
}
// 支持带上下文消息的重载(如填充动态参数)
public BusinessException(BusinessErrorCode errorCode, Object... args) {
super(String.format(errorCode.getMessage(), args));
this.errorCode = errorCode;
}
public BusinessErrorCode getErrorCode() {
return errorCode;
}
}
使用示例:抛出与捕获
业务逻辑中直接用枚举值抛出异常,清晰表达意图;全局异常处理器可统一提取码和消息:
// 服务层
public void withdraw(String userId, BigDecimal amount) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new BusinessException(BusinessErrorCode.USER_NOT_FOUND));
if (user.getBalance().compareTo(amount) > handleBusinessException(BusinessException e) {
Map<string object> result = new HashMap();
result.put("code", e.getErrorCode().getCode());
result.put("message", e.getMessage());
return ResponseEntity.badRequest().body(result);
}</string>
进阶:支持多语言与动态消息
若需国际化,可将枚举中的 message 替换为资源键(如 "error.user.not.found"),在异常处理器中通过 MessageSource 解析;也可在枚举中增加 getI18nKey() 方法,保持枚举职责单一。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











