java中通用异常父类应继承runtimeexception,定义含code、message及cause构造器的baseexception基类,通过模块化子类(如userexception)和全局@exceptionhandler统一处理业务异常。

Java 中定义通用异常父类,核心是建立一个业务异常基类,让所有业务场景异常都继承它,便于统一捕获、日志记录、响应封装和错误码管理。
选 RuntimeException 作为基类更实用
绝大多数业务异常(如用户不存在、参数非法、权限不足、状态冲突)属于程序运行中可预判但无需强制处理的逻辑问题。继承 RuntimeException 避免在每一层方法签名加 throws,不污染接口契约,也符合 Spring 等主流框架默认处理习惯。
- 不用在 service 方法上写
throws BusinessException,调用方不会被编译器强制要求 try-catch - 全局异常处理器(
@RestControllerAdvice)能自然捕获所有子类,无需逐个声明 - 与 Spring 的
@Valid校验异常、自定义校验注解抛出的异常风格一致
设计精简、可扩展的基类结构
基类只保留最必要的字段:错误码(code)、提示消息(message),并确保支持异常链。不放业务数据、不加 setter、不重写 toString 或 printStackTrace。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 提供两个必需构造器:
BaseException(String code, String message)和BaseException(String code, String message, Throwable cause) - 调用
super(message, cause),确保原始堆栈不丢失 - 用
final修饰code字段,避免子类意外修改 - 避免添加
data、timestamp、requestId等上下文字段——这些应由全局处理器或日志 MDC 注入,而非塞进异常对象
按模块/领域派生具体异常子类
基类不直接使用,而是为不同业务域定义语义清晰的子类,比如 UserException、OrderException、PaymentException。每个子类可内置静态工厂方法,提升可读性与复用性。
-
UserException.userNotFound("U1001")比new UserException("USER-404", "用户未找到")更简洁 - 子类本身不新增字段或逻辑,仅作类型区分和语义归类,保持轻量
- 错误码建议用常量字符串(如
USER_NOT_FOUND = "USER-404"),避免硬编码
配合全局异常处理器完成统一响应
有了统一父类,@RestControllerAdvice 就可以精准拦截所有业务异常,返回标准化 JSON,同时做日志分级(warn 级别记录业务异常,error 级别留给系统级崩溃)。
- 拦截
BaseException及其子类,提取code和message构造Result.error(code, message) - 对敏感信息做脱敏,例如不把数据库异常详情返回给前端
- 记录完整堆栈(含 cause)到日志系统,供排查时追溯根因
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










