java异常设计核心是职责明确、语义清晰、捕获可控、扩展方便;应基于真实需求选择exception或runtimeexception为父类,按业务域分层(如businessexception→userexception→usernotfoundexception),统一构造方法与字段,并配合@controlleradvice实现标准化响应。

Java 中设计清晰规范的异常类继承体系,核心不是堆砌层级,而是让每层异常承担明确职责、语义可读、捕获可控、扩展方便。关键不在“有没有继承”,而在“为什么这样继承”。
明确顶层基类的定位与选择
不建议虚构或硬套不存在的基类(如 ApplicationException),它既非 JDK 也非 Spring 标准类型,盲目继承会导致编译失败。应基于真实需求选型:
- 需要调用方强制处理(如参数校验失败必须响应错误码)→ 继承 Exception(受检异常)
- 属于业务逻辑问题、无需上层显式捕获(如用户不存在、余额不足)→ 继承 RuntimeException(非受检异常)
- 若项目已定义统一基类(如
BaseException或BusinessException),则以此为起点,确保它本身继承自合适的父类并提供标准构造方法
按语义分层,避免扁平化命名
不要把所有异常都直接挂在顶层基类下。应建立有业务含义的中间层,体现“谁出的问题、什么性质的问题”:
- BusinessException(继承 RuntimeException):承载所有可预期的业务规则异常
- UserException、OrderException、PaymentException:领域子类,继承自 BusinessException
- UserNotFoundException、InsufficientBalanceException:具体场景异常,继承自对应领域类
这种结构让 catch (UserException e) 能覆盖整个用户域异常,而 catch (BusinessException e) 可做全局业务异常兜底。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
每个异常类必须具备基础能力
无论哪一层,自定义异常类都应满足最小可用性要求:
- 类名以 Exception 结尾(如
InvalidOrderStatusException),一眼识别类型 - 提供至少三个构造方法:无参、仅 message、message + cause(支持异常链传递)
- 若需携带业务信息(如错误码、请求 ID),应在基类中统一定义字段和 getter,子类不重复添加
- 避免在异常中添加业务逻辑方法或复杂状态,保持它只描述“发生了什么”
配合全局处理器形成闭环
再好的继承体系,没有统一出口也是碎片。需搭配 @ControllerAdvice 做标准化响应:
- 捕获 BusinessException 及其全部子类,返回统一 JSON(含 code、msg、timestamp)
- 对
IllegalArgumentException、NullPointerException等系统异常做日志记录+友好提示,不暴露堆栈 - 用
@ResponseStatus为特定异常绑定 HTTP 状态码(如UserNotFoundException → 404)
这样,前端看到的是稳定结构,后端维护的是清晰层次,调试时能顺藤摸瓜找到原始 cause。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










