因此,您将 Spring 实现到您的项目中,然后,根据墨菲定律,出现了异常。但不要惊慌——Spring 具有强大的错误处理能力!让我们弄清楚如何使用这些功能。
已检查和未检查的异常:为什么一切都如此混乱?
Java将异常分为两种类型:受控异常和非受控异常。受检查的异常需要显式处理。想象一下两个人行横道,人们正在穿过它们。一个过境点由一名严格检查员把守,并挂着“严格控制”标志。这里每个人都会被检查,没有权限的就不允许通过。这种转换类似于检查异常:它们需要强制处理,否则程序将无法编译。
相反,第二个转换不受控制。人们自由快速地通过它,没有任何检查。这类似于未经检查的异常:此类异常不需要处理,并且即使没有错误检查,代码也可以运行。然而,如果出现错误,它会意外地出现——就在“道路”上。
public void someMethod() throws IOException { throw new IOException("Oops, checked exception!"); }
@ExceptionHandler:当 bug 得到 VIP 处理时
@ExceptionHandler 是您自己的个人“保镖”,仅捕获和处理指定方法或类的异常。如果您想对某些错误给予 VIP 处理,请使用 @ExceptionHandler 注解该方法并享受。
public void someMethod() throws IOException { throw new IOException("Oops, checked exception!"); }
现在,每当遇到 ResourceNotFoundException 时,您的处理程序都会悄悄地打印一条友好的消息,而不是用户看到可怕的错误堆栈。
@ControllerAdvice:何时向左和向右提供建议
如果@ExceptionHandler只适用于特定的类,那么@ControllerAdvice就是排队之王。该注释覆盖了所有控制器,因此 bug 不会再次被漏掉!
@ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) { return new ResponseEntity<>("Resource not found: " + ex.getMessage(), HttpStatus.NOT_FOUND); }
使用此代码,所有未捕获的错误都将被捕获并通过一条消息进行处理。这就像一个针对例外情况的“全包”设置 - 方便且安全。
@ResponseStatus:当你想让异常更具表现力时
有时标准 HTTP 状态并不能完全捕捉异常的本质。但使用@ResponseStatus,您可以强制异常更具表现力。
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleGlobalException(Exception ex) { return new ResponseEntity<>("Oops, something went wrong!", HttpStatus.INTERNAL_SERVER_ERROR); } }
现在,当抛出 ResourceNotFoundException 时,Spring 将自动返回 404 状态,而无需强制您手动执行。添加戏剧性的好方法,对吧?
@RestControllerAdvice:针对 REST 爱好者
@RestControllerAdvice 类似于 @ControllerAdvice,但专门用于 REST 控制器。也就是说,它是您创建 API 的最佳选择,因为它返回 JSON 而不是 HTML 页面。支持真正的 REST 粉丝!
public void someMethod() throws IOException { throw new IOException("Oops, checked exception!"); }
这种方法可确保您的用户始终收到 JSON 格式的结构化响应,使您的 API 更加用户友好。
自定义例外:当标准例外不够时
在某些时候,您意识到标准 Exception 和 RuntimeException 根本无法表达您所处情况的全部悲剧。好吧,创建你自己的例外!自定义异常增添了一点个性,Spring 仍然尊重地处理它们。
@ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex) { return new ResponseEntity<>("Resource not found: " + ex.getMessage(), HttpStatus.NOT_FOUND); }
为其创建一个处理程序,应用程序的用户将看到一条清晰的消息,而不是一堆可怕的行。
结论
Spring 中的错误处理是一门艺术。从方法级处理到全局处理,从 JSON 响应到自定义状态,可能性确实是巨大的。
所以抓住@ExceptionHandler、@ControllerAdvice和@ResponseStatus,并将异常变成错误管理中的大师类。 Spring 已准备好帮助您处理任何错误并在用户面前挽回面子
以上是Spring 中的异常:如何克服错误的详细内容。更多信息请关注PHP中文网其他相关文章!