Spring Boot 全局异常处理怎么捕获定时任务异常
使用 @enablescheduling 配合自定义的 schedulerfactorybean 并设置 settaskexecutor 或 seterrorhandler,可以统一捕获定时任务的异常。默认情况下,spring 调度线程池中的未捕获异常会被吞掉,不会触发全局异常处理器。通过实现 schedulerexceptionparser 接口或在执行器中包装逻辑,可以将异常抛出到统一的错误处理链路中。

为什么默认全局异常处理器无法捕获定时任务异常
因为 Spring 的 @Scheduled 任务运行在独立的线程池中,该线程池默认配置了 UncaughtExceptionHandler 为空,导致异常被静默丢弃,不传播到主线程或全局异常拦截器。

如何验证自定义异常解析器的实际行为
通过实现 SchedulerExceptionParser 接口,重写 parseSchedulerException 方法,将特定异常转换为 SchedulerException,从而触发全局异常处理机制。以下代码展示了完整配置和验证过程。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.ScheduledMethodRunnable; import org.springframework.scheduling.support.ScheduledTask; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @Configuration @EnableScheduling public class SchedulingConfig { @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(5); scheduler.setThreadNamePrefix("scheduled-"); scheduler.initialize(); return scheduler; } @Bean public ScheduledTaskRegistrar scheduledTaskRegistrar(TaskScheduler taskScheduler) { ScheduledTaskRegistrar registrar = new ScheduledTaskRegistrar(); registrar.setTaskScheduler(taskScheduler); registrar.setErrorHandler(new SchedulerExceptionParser() { @Override public boolean parseSchedulerException(ScheduledTask task, Throwable ex) { if (ex instanceof RuntimeException) { throw new RuntimeException("Custom Exception Handler Triggered: " + ex.getMessage(), ex); } return false; } }); return registrar; } }
预期结果:当定时任务抛出 RuntimeException 时,全局异常处理器会捕获到包装后的异常,并返回统一的错误响应。











