You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring全局异常处理器仅记录日志后移交处理却无法触发的问题

全局异常处理器未触发问题排查与解决

问题描述

需要实现一个全局异常处理器,仅记录异常请求数据及少量信息后,将异常交回应用常规异常流程处理。已实现以下代码,但处理器从未触发(添加sysout语句也无输出):

@Order(Ordered.HIGHEST_PRECEDENCE)
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public void handleException(HttpServletRequest request, Exception ex) throws Exception {
        log.error("[ERROR]: {}, Route: {}, Method: {}, Data sent: {}", ex.getMessage(), request.getRequestURL().toString(), request.getMethod(), request.getParameterMap().toString());

        throw ex;
    }
}

可能原因及解决方案

1. 组件未被Spring扫描加载

如果GlobalExceptionHandler所在的包不在Spring Boot的组件扫描范围内,该类不会被实例化,自然无法生效。

  • 解决方式:
    • 将GlobalExceptionHandler移到主应用类(标注@SpringBootApplication的类)的子包下;
    • 或者在@SpringBootApplication上显式指定扫描路径:
      @SpringBootApplication(scanBasePackages = {"com.your.main.package", "com.your.exception.handler.package"})
      public class YourApplication {
          public static void main(String[] args) {
              SpringApplication.run(YourApplication.class, args);
          }
      }
      

2. 异常不在Spring MVC处理链中抛出

@ControllerAdvice只能捕获DispatcherServlet处理范围内的异常,比如Controller方法、ControllerAdvice内部抛出的异常。如果异常在Filter、Interceptor等前置组件中抛出,该处理器无法捕获。

  • 解决方式:
    • 针对Filter中的异常,需自定义Filter捕获并记录,再抛出或转发到错误处理节点;
    • 先在Controller中主动抛出异常测试,比如:
      @RestController
      public class TestController {
          @GetMapping("/test-exception")
          public String triggerException() throws Exception {
              throw new RuntimeException("测试触发异常");
          }
      }
      

3. 方法签名或注解配置问题

  • 检查@Order注解的导入是否正确,需使用org.springframework.core.Ordered,避免导入其他包下的同名类;
  • 尝试调整方法签名,添加WebRequest参数(不影响功能,仅用于验证注入是否正常):
    @ExceptionHandler(Exception.class)
    public void handleException(HttpServletRequest request, Exception ex, WebRequest webRequest) throws Exception {
        log.error("[ERROR]: {}, Route: {}, Method: {}, Data sent: {}", ex.getMessage(), request.getRequestURL().toString(), request.getMethod(), request.getParameterMap().toString());
        throw ex;
    }
    

4. 存在优先级更高的异常处理器

虽然配置了Ordered.HIGHEST_PRECEDENCE,但如果项目中存在其他标注@ControllerAdvice且优先级更高的处理器(比如@Order设置了更小的数值),会优先捕获异常。

  • 解决方式:
    • 暂时禁用项目中其他全局异常处理器,测试当前代码是否生效;
    • 通过日志打印Spring加载的异常处理器顺序,确认当前处理器的优先级配置是否生效。

内容的提问来源于stack exchange,提问作者Alefi Cunha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:05:29