统一自定义异常规范的核心是“说得清、抓得住、传得准、查得快”,要求统一继承runtimeexception、规范包路径、禁用裸throw、标准化命名与四构造方法、实现serializable并固定serialversionuid、封装errorcode和businessid字段、配合@controlleradvice全局处理并记录含关键字段的error日志。

团队中统一自定义异常规范,核心是让异常“说得清、抓得住、传得准、查得快”。不是写一堆类就完事,而是建立从命名、继承、构造、字段到使用的一整套协作约定。
统一继承体系与分类策略
明确业务异常只继承 RuntimeException(非受检异常),避免强制 throws 干扰业务主流程。所有自定义业务异常统一放在 com.xxx.exception 包下,不混用 Error 或受检异常(除非极特殊场景,如集成外部 SDK 要求)。禁止直接 throw new RuntimeException("xxx"),必须使用具体业务异常类。
标准化命名与结构
类名以 Exception 结尾,语义清晰,如 UserNotFoundException、InsufficientBalanceException。每个类必须提供四种构造方法:
- 无参构造(用于框架反射或默认实例)
- 仅含 message 的构造(
super(message)) - 含 message 和 cause 的构造(
super(message, cause)) - 含 message、errorCode 和 cause 的构造(支持错误码封装)
必须实现 Serializable,并声明固定 serialVersionUID,保障分布式调用或日志序列化稳定性。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
封装关键业务字段
除 message 和 cause 外,至少包含两个字段:
- errorCode:int 类型,全局唯一,按模块划分段(如用户模块 1000–1999,订单模块 2000–2999)
- businessId(可选但推荐):String 类型,用于关联订单号、用户ID、请求traceId等,便于日志串联和问题定位
提供对应 getter 方法,不暴露 setter,保证异常不可变性。
全局异常处理器与日志联动
在 Spring Boot 项目中,统一使用 @ControllerAdvice + @ExceptionHandler 捕获所有自定义异常。返回标准响应体(含 code、message、timestamp),同时自动记录 ERROR 级别日志,日志内容必须包含 errorCode、businessId 和完整异常链(cause 不丢失)。禁止在 service 层 catch 后吞掉异常或只 log 不 rethrow。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










