java业务异常编码规范要求错误码以模块英文前缀+递增序号命名(如user_not_found),统一用final枚举管理,绑定状态码与提示语,异常类强制传入枚举实例并支持参数填充,错误码仅用于内部定位,不暴露给用户。

Java 中规范业务异常编码,核心是让每个错误码能快速说清“谁出的错、错在哪、怎么查”,而不是堆砌数字或强行结构化。重点不在格式多漂亮,而在团队能一眼看懂、系统能稳定识别、日志和监控能自动归类。
错误码命名要带模块前缀,不靠数字猜含义
用可读性强的英文前缀 + 递增序号,比如 USER_NOT_FOUND、ORDER_CREATE_FAILED、PAY_TIMEOUT_EXCEEDED。避免纯数字(如 1001)、避免混合大小写或下划线混乱(如 UserNotFound、user-not-found)。前缀对应业务域,不是技术层——USER、ORDER、PAY 是模块,不是 Controller/Service 这种分层。
- 同一模块内编号顺序申请,不预留空位,不按严重程度排序
- 新增场景必须申请新码,禁用旧码需在枚举中标注
@Deprecated并说明替代方案 - 错误码字符串本身不拼接参数,动态内容由异常类填充(如 “用户 {0} 不存在”)
用枚举统一管理,绑定状态码与提示语
所有业务错误码必须定义在单个枚举中,禁止散落在常量类或字符串字面量里。每个枚举项明确携带:唯一编码字符串、中文提示语、HTTP 状态码(如 400/404/409)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 枚举提供
getCode()、getMessage()、getHttpStatus()方法,供异常类直接调用 - 不暴露原始 message 字段,防止被前端直接展示;用户看到的提示语应走独立的
userTip字段 - 枚举类加
final修饰,禁止继承或修改实例
异常类必须强绑定错误码,支持上下文注入
自定义业务异常(如 BusinessException)构造时必须传入错误码枚举实例,不允许只传字符串或数字。同时支持传入可变参数,用于填充提示语中的占位符。
- 构造方法示例:
new BusinessException(USER_NOT_FOUND, "u10086")→ 提示语变为 “用户 u10086 不存在” - 异常类内部持有
ErrorCode枚举引用,不转成字符串存储 - 日志记录时,自动提取
errorCode.getCode()和填充后的完整提示语,便于 ELK 搜索与告警匹配
错误码不输出给用户,也不体现等级或版本
错误码是给开发和运维看的“内部工单号”,不是给用户看的。前端展示的文案、App 弹窗提示、客服查询依据,都来自独立的 userTip 字段或 i18n 配置。
- 禁止在错误码里塞等级(如 ERR_USER_001)、版本(如 USER_V2_001)或环境标识(如 USER_DEV_001)
- 线上报错日志中,必须同时打印
error_code、error_message、stack_trace、request_id四要素 - 调用第三方失败时,错误码仍用本系统前缀(如 B_PAY_CALLBACK_TIMEOUT),但
error_message中需包含原始第三方错误码(如 “微信支付回调超时 [WX1002]”)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










