抽象类通过模板方法统一异常处理,子类仅需实现doExecute()并抛出带 ErrorCode 的业务异常,基类自动构造标准响应、绑定模块错误码枚举、透传上下文日志,并与@RestControllerAdvice分层兜底。

抽象类本身不直接处理异常返回结构,但它可以作为统一异常处理机制的“骨架提供者”——通过定义模板方法、约束子类行为、封装共用逻辑,把错误码构造、响应包装、日志记录等能力下沉到基类中,让具体业务子类只专注领域逻辑。
抽象类中定义统一异常响应模板
在抽象回调或服务基类里,声明一个不可重写的 handleWithExceptionGuard() 模板方法,内部按固定顺序执行:参数校验 → 业务执行 → 成功/异常分支 → 统一响应构造。所有异常(包括自定义 BusinessException、系统异常、校验异常)都在模板内捕获并转为标准 Result 或 JSON 响应体。
- 业务子类只需实现抽象方法 doExecute(),抛出带 ErrorCode 的业务异常即可
- 基类统一调用 buildErrorResponse(errorCode, args) 构造 {code, message, timestamp} 结构
- 避免子类重复写 try-catch-return,也不允许裸 throw Exception
抽象类强制绑定错误码枚举与异常类型
在抽象基类中声明泛型约束或 protected 抽象方法,要求子类必须提供所属模块的错误码枚举(如 UserErrorCode、PayErrorCode),确保每个子类的异常都携带语义清晰、前缀一致的错误码。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如定义 protected abstract Class<? extends ErrorCode> getErrorCodeClass();
- 基类可据此做枚举合法性校验,或用于日志打点时自动提取模块标识
- 结合自定义注解(如 @Module("user")),还能在运行时动态加载对应错误码配置
抽象类统一异常日志与上下文透传
在抽象类的异常拦截逻辑中,自动注入请求 ID、用户 ID、操作时间等上下文字段,并将 ErrorCode + 动态参数 + 堆栈摘要写入日志,不暴露敏感信息但保留可追溯性。
立即学习“Java免费学习笔记(深入)”;
- 使用 MDC(Mapped Diagnostic Context)预埋 traceId、userId 等键值对
- 对 BusinessException,仅记录 warn 级别 + errorCode.getCode() + 格式化 message
- 对 RuntimeException 及其子类,记录 error 级别 + 精简堆栈(去掉 JDK 内部帧)
配合全局处理器形成分层兜底
抽象类负责“本类作用域内”的异常结构化,而 @RestControllerAdvice 负责“整个 Web 层”的最终输出。二者职责分明:
- 抽象类内抛出的 BusinessException,由 @ExceptionHandler(BusinessException.class) 捕获并转成 HTTP 200 + 业务 code
- 抽象类未覆盖的异常(如子类误 throw NullPointerException),由更宽泛的 @ExceptionHandler(RuntimeException.class) 兜底,返回 500 + 通用提示
- 定时任务、异步线程等非 Web 场景,仍需 JVM 级 Thread.setDefaultUncaughtExceptionHandler 补充

















