Spring Boot全局异常排错核心是三步:一查异常是否进入处理器(扫描路径、注解类型、抛出位置);二查处理器是否生效(返回值、序列化、参数);三查返回是否正确(响应头、配置项、过滤器干扰)。

Spring Boot 全局异常排错,核心就三点:没捕获到异常、捕获了但没生效、生效了但返回不对。别被堆栈吓住,按顺序查这三块,90%的问题当场定位。
一、为什么异常根本没进全局处理器?
最常见的是异常类型不匹配或拦截范围不对。
- 检查你的
@ExceptionHandler方法是否明确写了要处理的异常类,比如@ExceptionHandler(NullPointerException.class)—— 它不会处理IllegalArgumentException,更不会兜底Exception - 确认全局处理器类加了
@RestControllerAdvice(不是@ControllerAdvice),否则 JSON 响应体不会自动序列化 - 确保该类在 Spring 扫描路径下(比如和启动类同包或子包),否则 Spring 根本不加载它
- 注意异常抛出位置:如果异常发生在
@Async方法、过滤器、拦截器或定时任务里,@RestControllerAdvice默认不生效,需额外配置
二、为什么进了处理器却没返回预期结果?
常因响应包装、状态码或日志逻辑出错。
- 检查方法返回值类型是否匹配:若用
ResponseEntity<Result>,必须手动设HttpStatus;若直接返回Result,确保类上有@ResponseBody(@RestControllerAdvice已包含) - 确认
Result类的字段名、getter 是否符合 Jackson 序列化要求(Lombok 的@Data或显式 getter) - 留意
@ExceptionHandler方法参数:必须含HttpServletRequest或HttpServletResponse才能取请求上下文;若需记录原始请求体,得配合ContentCachingRequestWrapper - 避免在处理器里再抛异常(比如日志写入失败),否则可能触发默认错误页,绕过你自己的逻辑
三、为什么日志有、返回也有,但前端收不到或格式乱?
问题往往出在 HTTP 层或客户端侧。
- 用浏览器或 curl 直接调接口,看响应头:
Content-Type: application/json是否存在;缺失说明返回被当成 HTML 处理了 - 检查是否误配了
spring.mvc.throw-exception-if-no-handler-found=true,它会让 404 跳过全局处理器,走默认/error - 确认没有其他过滤器(如安全框架、自定义 Filter)提前中断响应流或覆盖了 body
- 前端若用 axios,注意默认不抛网络异常;4xx/5xx 响应需主动读取
error.response.data,而非error.data
不复杂但容易忽略。


















