应使用runtimeexception作为基类设计可扩展异常父类,因其非检查型特性避免强制try-catch干扰业务流,同时支持错误码、动态消息模板、结构化上下文及http状态码等统一扩展能力。

设计可扩展的异常处理父类,核心是让子类能灵活区分异常类型、携带上下文、支持统一处理,同时不破坏开闭原则。Java 中推荐用自定义运行时异常(RuntimeException)作为基类,而非检查型异常(Exception),避免强制 try-catch 干扰业务流。
定义通用异常父类:携带关键元数据
父类应封装错误码、消息模板、原始参数、堆栈控制等,便于日志、监控和前端友好提示:
- 用
String code标识唯一错误场景(如"USER_NOT_FOUND"),比纯消息更利于国际化和分类统计 - 用
String messageTemplate+Object... args支持动态占位(如"用户 {0} 不存在"),避免拼接字符串丢失类型信息 - 提供
getDetail()方法返回结构化上下文(如 Map 或专用 Detail 对象),供日志或告警提取敏感字段 - 重写
getMessage()延迟渲染,确保每次调用都基于当前参数生成最新消息
子类按领域分层继承:语义清晰 + 易于扫描
不要把所有异常塞进一个类,而是按业务模块或错误性质分包继承:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
auth/InvalidTokenException、auth/PermissionDeniedException—— 认证授权层 -
order/InventoryShortageException、order/OrderAlreadyPaidException—— 订单域 - 共用父类
BaseBusinessException,但每个子类有独立 error code 和默认消息,避免运行时 if-else 判断类型
支持统一异常处理器与扩展点
Spring Boot 场景下,用 @ControllerAdvice 拦截父类及其子类,并预留钩子供子类定制行为:
- 在父类中定义
shouldLogStack()默认返回 true,特定子类(如参数校验异常)可覆写为 false - 定义
httpStatus()方法,子类返回对应 HTTP 状态码(INVALID_PARAM → 400,NOT_FOUND → 404) - 统一处理器中根据
instanceof或getClass().getAnnotation()做细粒度响应格式(JSON / XML / HTML)
避免常见陷阱
可扩展性常被细节破坏:
- 不要在父类构造器里做耗时操作(如远程查码表),异常创建应轻量
- 禁止在父类中持有 Spring Bean(如
MessageSource),会导致循环依赖;改用静态工具类或注入到处理器中 - 子类不要重写
toString()隐藏关键字段,调试时难排查;建议只增强日志输出格式 - 错误码命名用大写+下划线(
ORDER_PAYMENT_TIMEOUT),避免大小写混用导致配置或枚举匹配失败
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










