Java Spring ExceptionHandler Controller 语法和良好实践
Posted
技术标签:
【中文标题】Java Spring ExceptionHandler Controller 语法和良好实践【英文标题】:Java Spring ExceptionHandler Controller syntax and good practices 【发布时间】:2021-12-02 10:08:16 【问题描述】:我想在 Spring 中正确处理我的异常,所以我有一个关于 exceptionHandler 语法的问题:如果它们被异常处理程序捕获,是否可以在控制器中抛出特定异常?
更具体地说:
这里是例外:
public class UnknownUserException extends Exception
private static final long serialVersionUID = 1L;
public UnknownUserException(String message)
super(message);
这里是 ExceptionHandler 和 UnknownUserException 的具体方法:
@ControllerAdvice
@ResponseBody
public class ControllerExceptionHandler
@ExceptionHandler(UnknownUserException.class)
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public ErrorMessage unknownUserExceptionMessage(UnknownUserException ex, WebRequest request)
ErrorMessage message = new ErrorMessage("The user doesn't exist: " +ex.getLocalizedMessage(), ex);
return message;
这是一个可能引发该异常的映射示例:
@GetMapping("/user/id")
public ResponseEntity<UserProfileDto> getById(@PathVariable Long id) throws UnknownUserException
UserProfileDto user = userService.findById(id);
return ResponseEntity.ok(user);
userService.findById(id) 可能会抛出 UnknownUserException。
据我了解,如果服务抛出特定异常,controllerAdvice 会“覆盖”控制器,但是,我应该如何处理我的控制器?我应该再次抛出异常(如上)还是捕获特定异常并返回 ResponseEntity(HttpStatus.NOT_FOUND) ?
【问题讨论】:
【参考方案1】:在理想情况下,当您知道在您的情况下应该立即抛出异常,因为您提到服务方法将抛出UnknownUserException
,这是正确的做法。您的 Controller Advice 应该能够处理该异常。 ContollerAdvice
将处理在请求执行期间抛出的任何匹配异常,无论异常的来源如何。
有关处理异常的其他选项,请参阅this 链接
【讨论】:
感谢您的确认,关于何时抛出/捕获异常,我仍然有点麻烦。 当您有其他服务可供选择时,您应该捕获异常。换句话说,捕获那些对服务请求没有任何影响的异常。例如获取可用书籍的请求,您可以从数据库或缓存中获取书籍列表。如果数据库关闭,您可以从缓存中服务(捕获 db 异常)请求。但请确保在响应中添加信息,表明它不是完整/最新的响应。 我明白了,谢谢,这很有帮助。我还没有为应用程序构建缓存,但这引起了我的注意,所以我现在就查找它,因为实现它是一件有趣且有用的事情。至少,我看到我以正确的方式使用了 catch,因为现在,我只在我的存储服务中捕获 Exception 以返回默认图像,以防在获取我的文件时出错(前面的损坏的 src 非常难看 ^ ^).以上是关于Java Spring ExceptionHandler Controller 语法和良好实践的主要内容,如果未能解决你的问题,请参考以下文章
[Spring实战系列](15)使用Spring基于Java的配置
java [CashierControllerTest] Spring Controller单元测试类#java #spring