异常被多次抛出,没有被ExceptionHandler捕获

时间:2020-09-29 16:47:01

标签: java spring-boot spring-mvc exception

我的应用程序是Spring Boot Web应用程序。我在使用ExceptionHandler捕获异常时遇到了一个独特的问题-我认为这是因为在我的应用程序流中多次抛出并重新抛出了异常。

这是问题的高级描述:

  1. 我在服务中抛出ExceptionType1。
  2. 我的ExceptionType1异常被我的ErrorController类的error()方法捕获
@Override
@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    boolean isErr = (boolean) request.getAttribute("filter.error");
    if (isErr) {
        //the error was thrown by cta filter, throw ExceptionType2
        throw new ExceptionType2(errorMsg, errorCode);
    } else {
        //handle other errors

我发现了错误,将ExceptionType1异常转换为ExceptionType2异常,然后将其重新抛出为ExceptionType2

  1. 上面抛出的ExceptionType2异常被我的ExceptionHandler类捕获
@Component  
@ControllerAdvice  
public class MyExceptionHandler {    
@ExceptionHandler({ExceptionType2.class})    
public final String handleExceptionType2(ExceptionType2 e) throws ExceptionType3 {      
throw new ExceptionType3(errorMsg, errorCode);   
}

上面的ExceptionHandler有一个@ExceptionHandler方法,该方法捕获在上一步中引发的ExceptionType2错误,将该异常转换为ExceptionType3并重新抛出。 5.这是我的问题。还有另一个ExceptionHandler类,该类应该捕获ExceptionType3错误-但无法正常工作。我在ExceptionType3的@ExceptionHandler方法中放置了一个断点,但从未命中

TLDR-我基本上在代码中捕获了一个异常-那就是

  1. 已转换为另一种异常类型,并且
  2. 在我的代码中三次刷新为新的异常类型。

它在前2次有效,但最后一次尝试转换该异常并将其重新抛出为ExceptionType3-它没有被ExceptionType3的ExceptionHandler类捕获。

我现在的理论是-我已经转换了异常类型,并重新抛出了太多次异常。春天在这方面有一些限制吗?我认为这是因为-如果我在第5步之前的上述步骤中的任何时候创建并抛出ExceptionType3,它便可以被适当的ExceptionHandler类捕获。

任何对此的建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

我相信Spring不允许处理从其他异常处理程序重新抛出的异常。异常处理程序应该是将异常转换为HTTP响应或将其记录的最后一点。

解决您的问题的一种方法(可能有点肮脏)是手动调用ExceptionType3的处理程序。