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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通用异常处理程序可防止处理特定异常相关的知识,希望对你有一定的参考价值。

我有一个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消息处理。

我想通过handleMyCustomException方法处理MyCustomException,并通过handleGenericExceptions方法处理所有其他异常。 MyCustomException类扩展了Throwable。这有什么不对?

谢谢。

答案

我找到了解决方案,但我现在不知道为什么会这样。

MyCustomException类正在扩展Throwable,我将其更改为扩展RunTimeException。现在它按预期工作。

另一答案

我没有50个reuatations,所以我在这里回答,希望它有意义。

Throwable类有两个重要的子类,Error和Exception。你的MyCustomException扩展Throwable。在Spring中,如果你的代码抛出了Throwable,那么Spring默认会把它装饰成IllegalStateException!我在spring4.3源代码中看到了这一点,如果你想证明这一点,你添加@ExceptionHandler({IllegalStateException})并使你的MyCustomException不被修改,这个方法会抓住它!

以上证据在org.springframework.web.method.support.InvocableHandlerMethod#doInvoke中。

顺便说一下,我们通常会通过extends RuntimeException抛出异常,为什么要抛出Throwable。

以上是关于通用异常处理程序可防止处理特定异常的主要内容,如果未能解决你的问题,请参考以下文章

Informix 存储过程通用异常处理

开发之统一异常处理

springboot2.0处理任何异常返回通用数据格式

异常处理

20-异常处理

Python学习异常处理