【发布时间】:2021-12-08 22:07:42
【问题描述】:
我有一个控制器处理一些请求:
@RequestMapping(method = RequestMethod.POST, value = "/endpoint")
public ResponseEntity<MyResponse> myEndpoint(@RequestBody MyRequest request) throws Exception {
//...
}
这样的控制器可能会抛出几个异常,为此我使用@ExceptionHandler这种方式:
@ExceptionHandler(SomeSpecificException.class)
@ResponseBody
public ResponseEntity<Error> handleSomeSpeficicFailure(SomeSpecificException e) {
//handle specific exception
}
@ExceptionHandler(SomeOtherSpecificException.class)
@ResponseBody
public ResponseEntity<Error> handleSomeOtherSpeficicFailure(SomeOtherSpecificException e) {
//handle specific exception
}
//etc.
如果抛出的异常不属于任何已知类,我添加了一个通用的Exception.class 处理程序,它返回一个自定义的 500:
@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseEntity<Error> handleUnknownFailure(Exception e) {
//handle unknown exception
}
做了一些测试,它似乎工作正常。如果我抛出一个特定的异常,我会在特定的处理程序上调用,如果我抛出一个未映射的异常,我会在通用处理程序上调用。
但是,我没有看到任何关于保证首先调用特定方法然后调用通用方法的保证(JavaDoc 和 Spring 文档中都没有)。
如果 Spring 正在测试一个特定的异常是 instanceof Exception,那将是真的,所以它甚至可能首先在这个处理程序上调用我而不检查其他的。
我的问题是:
- 有谁知道添加
@ExceptionHandler(Exception.class)来处理一般异常是否是个好习惯?如果没有,正确的做法是什么? - 我怎样才能保证类层次结构会得到尊重(例如,如果有一天我有
SomeVerySpecificException extends SomeSpecificException,Spring 怎么知道它必须在SomeSpecificException上调用我 - 直接父级 - 在Exception之前- 祖父母)?
【问题讨论】:
标签: java spring spring-boot exception