抽象类通过模板方法模式统一异常处理与日志记录:final execute()封装前置日志、子类业务执行、统一异常捕获及钩子处理;子类仅实现doBusiness();handleException()钩子支持定制化异常响应;自动注入traceId等上下文并脱敏敏感信息。

在抽象类中实现统一的异常处理与日志记录,核心是利用模板方法模式 + 钩子方法 + 统一入口,避免子类重复写 try-catch 和 log 语句,同时保留子类对业务逻辑和异常分类的控制权。
定义受保护的模板方法
在抽象类中提供一个 final 的公共执行入口(如 execute()),封装通用流程:前置日志 → 执行子类逻辑 → 成功/异常统一处理。子类只需实现具体业务(用 abstract 方法),不接触异常捕获细节。
- 模板方法标记为 final,防止被重写破坏流程
- 抽象业务方法(如 doBusiness())由子类实现,返回结果或 void
- 所有异常最终由模板方法统一捕获并交由钩子方法处理
提供可定制的异常处理钩子
声明一个受保护的钩子方法(如 handleException(Throwable t)),默认实现基础日志+包装,子类可选择重写以适配不同异常类型(如区分 ServiceException、DataAccessException)、添加告警、或转换为特定业务异常。
- 默认钩子可用 Logger.error("执行失败", t) 记录全栈信息
- 子类重写时可做 instanceof 判断,对 SQL 异常加 traceId,对校验异常只打 warn 级别
- 钩子内可调用统一异常转换器(如将 SQLException → DataAccessException)
集成上下文与日志增强
在模板方法中自动注入请求 ID、操作名、入参摘要等上下文信息,让日志自带可追溯性。避免子类手动拼接 log 字符串。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 通过 ThreadLocal 或 MDC(如 Logback 的 MDC.put("traceId", ...))传递上下文
- 模板方法开头记录 “开始执行 [操作名],参数: {}”,结尾记录 “执行完成” 或 “失败”
- 异常日志中自动包含 traceId、method、args.toString()(注意脱敏敏感字段)
支持声明式异常规范
在抽象类上用注解(如自定义 @BusinessAction)声明该类预期抛出的业务异常类型,配合 AOP 或编译期检查工具,提醒子类必须处理或声明这些异常,强化契约一致性。
- 例如:@ExpectedExceptions({UserNotFoundException.class, InsufficientBalanceException.class})
- 结合 IDE 插件或注解处理器,验证子类 doBusiness() 是否 throws 声明了这些异常
- 运行时可在钩子中校验实际抛出异常是否属于预期范围,否则记录告警
不复杂但容易忽略的是上下文透传和敏感信息脱敏——统一模板的价值不在“写了日志”,而在“每次日志都有相同结构、相同字段、相同安全水位”。

















