java公司级错误码体系核心是类型安全、可追溯、语义化的机制,通过统一接口errorcode、基类baseerrorcode、业务域枚举、强类型bizexception及工程化保障实现。

Java构建公司级业务错误码体系,关键不是堆砌数字或写一堆常量,而是建立一套类型安全、可追溯、易协作的语义化机制。核心在于让每个错误码自带领域归属、可读含义、可扩展结构和统一出口。
定义统一接口与基类,约束错误码结构
所有错误码必须实现统一接口(如 ErrorCode),强制提供 code()、messageKey()、httpStatus() 等方法。再提供抽象基类(如 BaseErrorCode)封装共性逻辑:
- message 不直接存文案,只存 i18n 键(如
"user.not.found"),运行时通过MessageSource解析 - 支持懒加载 message,避免启动时全量初始化资源文件
- 默认 HTTP 状态码按语义预设(如参数类用
400,未授权用401,资源缺失用404) - 禁止在代码中硬写
new BizException(10001, "订单不存在")这类字面量调用
按业务域垂直拆分枚举,杜绝跨域复用
错误码包结构与业务模块对齐,例如:
com.company.order.error.OrderErrorCodecom.company.user.error.UserErrorCodecom.company.payment.error.PaymentErrorCode
每个枚举项语义清晰、命名大写蛇形:
ORDER_NOT_FOUND(10001, "order.not.found", HttpStatus.NOT_FOUND)USER_LOCKED(20005, "user.locked", HttpStatus.FORBIDDEN)- 码值建议 5 位以上,前两位代表域编号(如 10=订单、20=用户),便于快速识别来源
- 共用错误(如系统级超时、熔断)统一收口到
common.ErrorCode,不散落在各模块
绑定异常类,全程强类型传递
自定义 BizException,构造时必须传入 ErrorCode 枚举实例,禁止继承 RuntimeException 后裸 throw 字符串:
- Service 层抛出:
throw new BizException(OrderErrorCode.ORDER_INVALID_STATUS); - 支持动态填充上下文:
throw new BizException(UserErrorCode.USER_NOT_FOUND, "id={0}", userId); - 全局异常处理器(
@ControllerAdvice)捕获后,自动提取 code、解析多语言 message、注入 requestId,返回标准 JSON 响应体 - 日志框架自动记录
error.code和requestId,便于 ELK 快速聚合追踪
配套支撑与落地检查点
规范落地不能只靠约定,需配套工程化保障:
- i18n properties 文件(如
error_zh_CN.properties)必须与枚举 key 严格对应,可用 IDEA 插件或编译期注解处理器校验缺失 - CI 流程中加入错误码扫描:检测重复码值、未使用枚举项、messageKey 是否为空
- 前端 SDK 按 error.code 做差异化处理(如 10001 跳转订单页,20005 弹锁定提示)
- 文档中心自动生成错误码手册,枚举类 Javadoc 注明典型触发场景与修复建议
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











