Java自定义非受检异常应以XxxException结尾,名称直白体现业务语义(如InsufficientBalanceException),采用形容词+名词结构,避免动词开头或缩写;需提供无参、String message、Throwable cause等实用构造器,消息含关键上下文;抛出应克制,仅用于逻辑错误或业务规则违反;须配合@RestControllerAdvice统一返回结构化JSON响应。

Java自定义非受检异常(即继承 RuntimeException 的异常)应以 XxxException 结尾,名称需直白表达业务语义,例如 OrderValidationException、InsufficientBalanceException,避免笼统如 MyException 或冗余如 BusinessRuntimeException。
命名要体现错误本质
名称不是为了“分类”,而是让调用方一眼看懂问题所在。比如用户余额不足时抛出的异常,叫 InsufficientBalanceException 比 PaymentException 更精准;订单状态非法时,用 InvalidOrderStatusException 而非 OrderException。
- 优先使用形容词+名词结构(如
ExpiredTokenException、MissingRequiredFieldException) - 避免动词开头(如
ValidateFailedException)或缩写(如InvldInputExc) - 若涉及领域对象,前置该对象名(如
UserNotFoundException、ProductStockException)
构造器设计要实用
至少提供两个构造器:无参构造器和带 String message 的构造器。推荐额外支持带 Throwable cause 的三参构造器,便于封装底层异常。
- 消息内容应包含关键上下文,例如
"用户ID=12345的状态不支持此操作",而非仅"操作非法" - 避免在构造器中做耗时操作(如远程调用、日志输出),保持轻量
- 若需携带业务码,可增加含
int errorCode或String code的构造器(如BusinessException(4001, "库存不足"))
抛出时机要克制且明确
非受检异常适合表达「程序不该走到这里」的逻辑错误或违反业务规则的情形,不是所有报错都该自定义一个异常类。
立即学习“Java免费学习笔记(深入)”;
- 参数校验失败、状态非法、前置条件不满足——适合抛出自定义非受检异常
- 网络超时、数据库连接失败——优先复用标准异常(如
IOException、SQLException),或封装为受检异常 - 同一业务域内多个相似错误,可共用一个异常类,靠消息或错误码区分,不必为每种提示新建类
配合全局处理器统一响应
单独抛出异常没意义,必须与 @RestControllerAdvice 配合,将异常转为结构化 JSON 响应(如 { "code": 4001, "message": "库存不足" })。
- 在全局处理器中提取自定义异常的错误码、业务 ID、时间戳等字段,丰富返回信息
- 对不同异常类型设置不同 HTTP 状态码(如参数类异常用 400,权限类用 403,系统类用 500)
- 生产环境建议屏蔽堆栈详情,开发环境可开启用于快速定位


















