我有spring mvc应用程序。要捕获异常,我使用@ExceptionHandler
注释。
@ControllerAdvise
public class ExceptionHandlerController {
@ExceptionHandler(CustomGenericException.class)
public ModelAndView handleCustomException(CustomGenericException ex) {
....
}
}
但我认为在控制器方法调用之后我只会捕获异常。
但是如何捕获在其余上下文之外生成的异常?例如生命周期回调或计划任务。
答案 0 :(得分:1)
但是如何捕获在其余上下文之外生成的异常?对于 示例生命周期回调或计划任务
我能想到的一个解决方案是使用After Throwing Advice。基本思想是定义一个建议,该建议将捕获某些bean抛出的异常并适当地处理它们。
例如,您可以定义自定义注释,如:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Handled {}
并使用该注释来标记应该建议的方法。然后,您可以使用此注释注释您的工作:
@Component
public class SomeJob {
@Handled
@Scheduled(fixedRate = 5000)
public void doSomething() {
if (Math.random() < 0.5)
throw new RuntimeException();
System.out.println("I escaped!");
}
}
最后定义一个建议,处理由@Handled
注释的方法抛出的异常:
@Aspect
@Component
public class ExceptionHandlerAspect {
@Pointcut("@annotation(com.so.Handled)")
public void handledMethods() {}
@AfterThrowing(pointcut = "handledMethods()", throwing = "ex")
public void handleTheException(Exception ex) {
// Do something useful
ex.printStackTrace();
}
}
对于方法执行的更细粒度控制,您也可以使用Around Advice。另外,请不要忘记在Java配置中使用@EnableAspectJAutoProxy
或在XML配置中使用<aop:aspectj-autoproxy/>
来启用自动调整。