通用异常处理程序可防止处理特定异常

时间:2019-04-13 18:37:55

标签: spring spring-boot exception

我有一个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。怎么了?

谢谢。

2 个答案:

答案 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。