java抽象类通过模板方法模式封装日志与异常兜底逻辑,基类定义final execute()流程(日志→业务→结果/异常处理),子类实现protected abstract dobusiness(),支持mdc上下文、分层异常捕获及钩子扩展。

在 Java 抽象类中封装通用日志记录与异常兜底逻辑,核心是利用抽象类的继承特性 + 模板方法模式,把横切关注点(如日志、异常处理)统一收口,同时保留子类对业务逻辑的自主实现权。
定义抽象基类并声明模板方法
抽象类不直接执行业务,而是提供一个“骨架流程”,其中关键步骤(如核心处理)由子类实现,而日志和异常处理由基类统一完成。
- 用 protected abstract 声明子类必须实现的业务方法(如
doBusiness()) - 提供一个 final public 方法(如
execute())作为入口,内部按顺序调用日志记录 → 业务执行 → 成功日志 / 异常捕获 → 兜底处理 - 避免子类绕过统一流程,所以入口方法加
final
统一日志记录时机与上下文
日志不是简单打一句“开始”,而是结合方法名、入参(可选脱敏)、执行耗时、结果状态,提升可观测性。
- 使用 SLF4J 或 Logback,在
execute()开头记录 “Entering [method] with [params]” - 用
StopWatch(Spring)或System.nanoTime()记录耗时,结尾统一打印 “Exit [method], cost X ms, result: success/error” - 通过
ThreadLocal或 MDC 注入 traceId、userId 等上下文,确保日志链路可追踪
异常兜底:分类捕获 + 标准化响应
不建议在抽象类里 catch (Exception e) 一锅端,而应分层处理:
- 优先
catch业务自定义异常(如BizException),记录 warn 级日志,直接返回友好提示 - 再
catch受检异常(如IOException),转为运行时异常或封装为系统错误 - 最后
catch (RuntimeException e),记录 error 日志 + 堆栈,返回通用错误码(如 “SYSTEM_ERROR”) - 所有异常最终都通过统一返回对象(如
Result<t></t>)透出,避免子类自行 throw 或 printStackTrace
支持子类选择性增强或跳过某些环节
实际场景中,并非所有子类都需要完整日志或兜底。可通过钩子方法(Hook Method)提供扩展点:
- 定义
beforeLog()和afterLog()空方法(默认空实现),子类可选择重写 - 添加布尔标志(如
enableAutoLog)控制是否触发日志,子类构造时传入 - 对特定异常类型,允许子类提前处理(例如重试),基类只兜底“未被处理”的异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











