java - Java Spring ExceptionHandler 控制器语法和良好实践
问题描述
我想在 Spring 中正确处理我的异常,所以我有一个关于 exceptionHandler 语法的问题:如果它们被异常处理程序捕获,是否可以在控制器中抛出特定异常?
进一步来说 :
这是例外:
public class UnknownUserException extends Exception {
private static final long serialVersionUID = 1L;
public UnknownUserException(String message) {
super(message);
}
}
这是具有 UnknownUserException 特定方法的 ExceptionHandler :
@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) ?
解决方案
在理想情况下,当您知道在您的情况下应该立即抛出异常,因为您提到服务方法将抛出UnknownUserException
正确的事情。您的 Controller Advice 应该能够处理该异常。ContollerAdvice
将处理在请求执行期间抛出的任何匹配异常,而不管异常的来源。
有关处理异常的其他选项,请参阅此链接
推荐阅读
- azure - 如何将 Application Insights 从一个区域迁移到另一个区域?
- c# - C# 无论如何要从 IQueryable 聚合(不是 AsEnumerable)
- python - 熊猫合并数据框从末尾移动新列
- python - 单个值的按位异或校验和?
- excel - 如何检查范围并将包含值的单元格复制到另一个单元格
- python - Selenium WebDriver - 无法找到元素?
- django - 如何从 Django 中的关系数据库中检索数据
- pandas - X 轴上的日期(Matplotlib 绘图)
- java - 如何在 Java 的另一个文件中使用自定义类?
- python-3.x - 在 python 3 中 for 循环结束后,光标应保持在同一行