高内聚异常基类需统一错误语义、固化构造契约、强制保留根因:定义抽象基类封装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,支持运行时注入关键业务字段(如context.put("orderId", "ORD-20260609"))
子类仅扩展语义,不重写构造逻辑
业务异常类只需继承基类,并复用其构造能力,无需重写任何构造方法:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 子类定义保持极简:
public class InventoryShortageException extends BaseException - 构造时直接调用
super(ErrorCode.INVENTORY_SHORTAGE, "库存不足", e) - 避免在子类中新增构造器——否则会绕过基类对
cause的强制约束 - 若需附加字段(如缺货数量),应通过
context注入,而非新增构造参数
配合编译期检查与构建约束
仅靠编码规范不够,需工程化保障:
立即学习“Java免费学习笔记(深入)”;
- 在 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},确保堆栈包含全部嵌套异常

















