我的应用程序是Spring Boot Web应用程序。我在使用ExceptionHandler捕获异常时遇到了一个独特的问题-我认为这是因为在我的应用程序流中多次抛出并重新抛出了异常。
这是问题的高级描述:
@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
@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-我基本上在代码中捕获了一个异常-那就是
它在前2次有效,但最后一次尝试转换该异常并将其重新抛出为ExceptionType3-它没有被ExceptionType3的ExceptionHandler类捕获。
我现在的理论是-我已经转换了异常类型,并重新抛出了太多次异常。春天在这方面有一些限制吗?我认为这是因为-如果我在第5步之前的上述步骤中的任何时候创建并抛出ExceptionType3,它便可以被适当的ExceptionHandler类捕获。
任何对此的建议将不胜感激。
答案 0 :(得分:0)
我相信Spring不允许处理从其他异常处理程序重新抛出的异常。异常处理程序应该是将异常转换为HTTP响应或将其记录的最后一点。
解决您的问题的一种方法(可能有点肮脏)是手动调用ExceptionType3
的处理程序。