企业级Java架构中错误码与异常响应是一套业务语义通信协议,需通过统一接口+领域枚举、强类型异常绑定、分层继承结构、全局处理器四维度落地规范。

统一错误码接口 + 领域枚举化管理
所有错误码必须实现一个公共接口(如 ErrorCode),强制定义 code()、messageKey()、httpStatus() 等方法。再提供抽象基类(如 BaseErrorCode)封装 i18n 懒加载、默认状态码等逻辑。
按业务域垂直拆分枚举包,结构与微服务/模块对齐:
-
com.company.order.error.OrderErrorCode:如ORDER_NOT_FOUND(10001, "order.not.found", NOT_FOUND) -
com.company.user.error.UserErrorCode:如USER_LOCKED(20005, "user.locked", FORBIDDEN) - 码值建议 5 位以上,前两位代表领域编号(10=订单、20=用户),便于快速识别来源
- message 不存文案,只存 i18n 键;真实提示由
MessageSource运行时解析,支持多语言切换
强类型异常绑定,杜绝字符串裸抛
定义唯一业务异常类 BizException,构造时必须传入 ErrorCode 枚举实例,禁止用 new RuntimeException("xxx") 或 new BizException(10001, "订单不存在") 这类弱类型写法。
支持上下文动态填充:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
throw new BizException(OrderErrorCode.ORDER_INVALID_STATUS);throw new BizException(UserErrorCode.USER_NOT_FOUND, "id={0}", userId);
异常自动携带 traceId、errorCode、关键参数(如 orderId、userId),并注入 MDC 日志上下文,方便全链路追踪。
分层异常继承结构,体现业务边界
避免零散定义,建立三层继承体系:
-
顶层基类(如
BaseBusinessException):继承RuntimeException,统一字段(errorCode、timestamp、traceId),支持序列化 -
领域子类(如
OrderException、PaymentException):按限界上下文划分,体现模块自治,便于团队分工与依赖治理 -
场景级异常(如
InsufficientBalanceException、InvalidPromotionCodeException):动宾命名,精准映射规则,不带模糊词(如 “Error”、“Failed”)
全局处理器驱动标准化响应与分级处置
所有 Controller 层异常必须由 @RestControllerAdvice 统一拦截,禁止在 Controller 或 Service 中手动 try-catch 封装返回体。
处理器职责明确分层:
- 优先捕获
BizException:返回标准 JSON(code/message/timestamp/requestId),HTTP 状态码按语义映射(400/403/404/500) - 再处理 Spring 校验异常(如
MethodArgumentNotValidException):提取字段级错误,聚合为业务友好提示 - 兜底捕获
Throwable:记录完整堆栈 + traceId,响应体仅返回通用 500 提示,绝不暴露敏感信息
配套做三件事:
- 日志自动打印
error.code和requestId,ELK 中可秒级聚合分析高频错误 - 敏感字段(手机号、身份证)在日志和响应中自动脱敏
- 按错误码前缀对接告警系统(如
ORDER-005超卖触发即时告警,PAY-012回调失败仅记审计日志)

















