高内聚异常基类需统一错误语义、固化构造契约、强制保留根因:定义抽象基类封装errorcode与context,仅提供带cause的受保护构造器,子类不得重写构造逻辑,辅以ci检查、lombok约束及链路完整性校验。

设计高内聚的异常基类,核心是统一错误语义、固化构造契约、强制保留根因——不是简单继承 RuntimeException,而是让每个子类在创建时天然支持异常链传递。
定义抽象基类,封装错误码与上下文
基类必须是抽象的,禁止直接实例化;它要承载领域级错误标识(如错误码)、结构化上下文(如订单号、用户ID),并只提供带 cause 的构造入口:
- 声明
final ErrorCode errorCode,确保错误类型不可篡改 - 提供唯一受保护构造器:
protected BaseException(ErrorCode code, String msg, Throwable cause) - 禁用无
cause的构造器(如不提供BaseException(ErrorCode, String)),从源头杜绝丢根因 - 内置
Map<string object> context</string>,支持运行时注入关键业务字段(如context.put("orderId", "ORD-20260609"))
子类仅扩展语义,不重写构造逻辑
业务异常类只需继承基类,并复用其构造能力,无需重写任何构造方法:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 子类定义保持极简:
public class InventoryShortageException extends BaseException - 构造时直接调用
super(ErrorCode.INVENTORY_SHORTAGE, "库存不足", e) - 避免在子类中新增构造器——否则会绕过基类对
cause的强制约束 - 若需附加字段(如缺货数量),应通过
context注入,而非新增构造参数
配合编译期检查与构建约束
仅靠编码规范不够,需工程化保障:
- 在 CI 流程中加入 SpotBugs 或 ErrorProne 规则,拦截所有未传
cause的异常抛出 - 使用 Lombok 的
@RequiredArgsConstructor配合final字段,防止遗漏构造参数 - 在基类
initCause()中加日志告警(非覆盖,仅记录误用行为),辅助灰度期治理 - 接口层方法签名显式声明受检异常子类(如
throws UserLockedException),倒逼调用方处理,而非吞掉或转为RuntimeException
统一异常处理器识别链路完整性
全局异常处理器可主动校验异常链是否完整,增强可观测性:
- 在
@ExceptionHandler中检查e.getCause() == null且非底层驱动异常,触发告警 - 序列化响应时,自动展开
getCause()链,生成带层级的错误详情(如"causedBy": {"type": "DatabaseConnectionException", "message": "Connection timeout"}) - 日志框架(如 Logback)配置
%ex{full},确保堆栈包含全部嵌套异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










