java自定义异常应将订单号、用户id、错误码等作为final只读字段封装,而非拼入getmessage();提供多构造方法、getter及重写tostring(),配合错误码枚举实现结构化、可监控、易调试的业务异常体系。

Java 自定义异常携带业务上下文数据,核心是把订单号、用户ID、错误码等结构化信息作为只读字段存进异常对象里,而不是拼在 getMessage() 字符串中。这样日志能提取字段、监控可按码统计、调用方能安全读取,不丢失关键线索。
用 final 字段封装上下文,别塞 message
message 只负责人类可读的简要提示(如“余额不足”),真实上下文必须用明确字段承载:
- 声明
private final String orderId;、private final Long userId;、private final String errorCode;等字段,加 final 防止被篡改 - 避免用
Map<string object></string>存任意键值——字段名即语义,利于 IDE 提示、序列化和日志解析 - 不要在构造方法里把 orderId 拼进 message,例如
super("余额不足,订单号:" + orderId),这会让机器无法结构化解析
提供多组构造方法,覆盖常用场景
每个构造方法都必须调用 super(message) 或 super(message, cause),否则父类信息丢失,getMessage() 可能为空:
-
BizException(String message):基础用法,兼容老代码 -
BizException(String message, String orderId, Long userId):带关键业务上下文 -
BizException(String message, Throwable cause, String orderId, String errorCode):保留原始异常链 + 业务上下文,适合包装 DAO 或 RPC 异常
重写 toString() 和 getter,让信息真正可用
Java 异常默认不打印新增字段,必须显式暴露:
- 为每个上下文字段提供 public getter,例如
public String getOrderId() { return orderId; } - 重写
toString(),返回包含父类信息和上下文的格式化字符串,例如:
return super.toString() + ", orderId=" + orderId + ", userId=" + userId + ", errorCode=" + errorCode; - 日志中应使用结构化打印:
log.error("业务失败", e);并配合 logback 的%ex或 MDC,或手动输出:log.error("订单创建失败[order={}][user={}][code={}]", e.getOrderId(), e.getUserId(), e.getErrorCode(), e);
搭配错误码枚举,语义更清晰
错误码不应是硬编码字符串或数字,而应来自统一管理的枚举:
- 定义
enum BizErrorCode { ORDER_NOT_FOUND("ORDER_001"), INSUFFICIENT_BALANCE("BALANCE_002"); } - 异常类中字段类型为
BizErrorCode code,构造时传入枚举实例 - 前端、监控、告警可直接基于
code.name()或code.getValue()做分支处理,不依赖 message 解析
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











