Spring Boot异常处理程序:抛出异常

5

使用这个很好

@ResponseStatus(value = HttpStatus.NOT_FOUND)
@ExceptionHandler(value = IoTException.class)
public void IoTError() {

}

但是当我试图转换为另一个自定义异常时
@ExceptionHandler(value = IoTException.class)
public void IoTError() {
    throw new IoTConnectionException();
}

异常处理程序被忽略了,即 IoTException 被发送到视图而没有转换为 IoTConnectionException。但放置断点后进入了 IoTError 方法。有什么想法吗?谢谢 :)

在 IoTException.class 上,@ExceptionHandler 内部没有被执行?被忽略了吗? - dimitrisli
修改了问题,使其更完整。 - Matthias Beaupère
IoTException.class 可以让你进入 @ExceptionHandler,从那里你可以抛出异常。如果你能看到调试器在 IoTError() 内部中断,那么你是在说异常没有被抛出吗? - dimitrisli
1
Spring捕获异常并将其解释为“ExceptionHandler”中的错误,因此处理程序被忽略。 - Matthias Beaupère
1个回答

8

关于异常处理的文档中指出:

如果在请求映射期间发生异常或从请求处理程序(例如@ Controller)抛出异常,则DispatcherServlet将委托给一系列HandlerExceptionResolver bean来解决异常并提供替代处理,通常是错误响应。

在抛出IoT异常的时候,已经进行了对HandlerExceptionResolver链的委派,并且不会再次执行。如果此异常触发另一个异常处理调度,可能会导致异常循环。想象一下,您定义了另一个IoTConnectionException的异常处理程序方法,并且这会引发IoTException。 您将以StackOverflowException结束。

异常处理程序方法文档中描述了异常处理程序方法支持的所有返回值。


你是对的,我的异常被解释为异常处理中的错误:“无法调用@ExceptionHandler方法”,而不是另一个要处理的异常。 - Matthias Beaupère
实际上有一个@ControllerAdvice类我不知道,里面还有另一个@ExceptionHandler就像你猜的一样。我把我的处理程序移动到这个类中,并调用了前一个处理程序,而不是抛出异常,结果它起作用了! - Matthias Beaupère

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接