java自定义异常需与全局异常处理器协同:继承runtimeexception定义带错误码、提示消息等字段的异常,在业务层主动抛出;用@restcontrolleradvice精准捕获并返回统一result格式,注意sentinel等中间件异常需单独处理。

Java 中自定义异常要真正发挥作用,必须和全局异常处理器协同工作——前者负责“精准抛出”,后者负责“统一响应”。关键不是随便写个 extends RuntimeException 就完事,而是让异常类型可识别、信息可提取、响应可控制。
定义带语义和结构的自定义异常
推荐继承 RuntimeException(非受检异常),避免强制 try-catch 干扰业务流。重点是封装必要字段:
- 错误码(
String code或ErrorCode枚举),用于前端映射、日志分类、监控告警 - 用户提示消息(
String message),支持占位符动态填充,如"库存不足,当前:%s,需:%s" - 可选上下文字段(如
requestId、userId),便于问题追踪 - 提供多参构造函数,确保能传入
code + args或code + message + cause
在业务层按需主动抛出
不要等到空指针或 SQL 异常才处理。在 Service 或 Domain 层校验失败时,直接抛出自定义异常:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
-
用户名已存在:抛出
UsernameAlreadyExistsException("zhangsan") -
库存不足:抛出
BusinessException("INSUFFICIENT_STOCK", 10, 25) -
权限不足:抛出
AuthException("PERMISSION_DENIED")
这样异常源头清晰,调用链上不丢失业务意图。
用 @RestControllerAdvice 精准捕获并格式化响应
全局处理器必须用 @RestControllerAdvice(不是仅 @ControllerAdvice),否则会走视图解析,报 Circular view path 错误。
- 为每类自定义异常写独立的
@ExceptionHandler方法,比如:@ExceptionHandler(BusinessException.class) - 方法返回值统一为项目约定的
Result对象,如Result.fail(e.getCode(), e.getMessage()) - 按从具体到宽泛顺序排列方法:先处理
BusinessException,再IllegalArgumentException,最后兜底@ExceptionHandler(Exception.class) - 在兜底方法中记录完整堆栈日志,但响应只返回通用提示(如 “系统繁忙,请稍后再试”),防止敏感信息泄露
注意 Sentinel 等中间件的异常隔离
像 BlockException 这类非 Exception 子类的异常,Spring 全局处理器默认捕获不到。必须单独配置其处理机制:
- 实现
BlockExceptionHandler接口,在handle()方法中识别FlowException、DegradeException等子类 - 手动构造与
Result格式一致的 JSON 响应,并写入HttpServletResponse - 不能依赖
@ExceptionHandler统一接管,这是常见误区
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










