我有一个spring boot应用程序,在那里我处理异常。我现在有两个异常处理程序方法:
@ControllerAdvice
@RestController
public class MyExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public final BaseResponse<GenericException> handleGenericExceptions(Exception ex, HttpServletRequest request) {
....
return response;
}
@ExceptionHandler(MyCustomException.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public final BaseResponse<MyCustomException> handleMyCustomException(MyCustomException ex, HttpServletRequest request) {
....
return response;
}
}
在某个时候,我抛出了MyCustomException异常,但是当我调试时,我看到它由handleGenericExceptions方法处理。如果删除handleGenericExceptions方法,则由handleMyCustomException消息处理。
我希望MyCustomException由handleMyCustomException方法处理,而所有其他异常由handleGenericExceptions方法处理。 MyCustomException类扩展了Throwable。怎么了?
谢谢。
答案 0 :(得分:0)
我找到了解决方案,但我现在不知道为什么会这样。
MyCustomException类正在扩展Throwable,我将其更改为扩展了RunTimeException。现在它正在按预期工作。
答案 1 :(得分:0)
我没有50个拒绝,所以我在这里回答,希望有道理。
Throwable类具有两个重要的子类Error和Exception。您的MyCustomException扩展Throwable。在spring中,如果您的代码引发了Throwable扩展,则Spring默认将其装饰为IllegalStateException!我在spring4.3源代码中看到了这一点,如果您想证明这一点,可以添加@ExceptionHandler({IllegalStateException})并使MyCustomException保持未修改的状态,该方法可以捕获它!
以上证据在org.springframework.web.method.support.InvocableHandlerMethod#doInvoke中。
顺便说一句,我们通常通过扩展RuntimeException抛出Exception,为什么要抛出Throwable。