跳到主要内容

异常

ChatGPT-4o-mini 中英对照 Exceptions

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

下表列出了可用的 HandlerExceptionResolver 实现:

表 1. HandlerExceptionResolver 实现

HandlerExceptionResolver描述
SimpleMappingExceptionResolver异常类名称与错误视图名称之间的映射。对于在浏览器应用程序中呈现错误页面非常有用。
DefaultHandlerExceptionResolver解析 Spring MVC 引发的异常并将其映射到 HTTP 状态码。另见替代的 ResponseEntityExceptionHandler错误响应
ResponseStatusExceptionResolver解析带有 @ResponseStatus 注解的异常,并根据注解中的值将其映射到 HTTP 状态码。
ExceptionHandlerExceptionResolver通过调用 @Controller@ControllerAdvice 类中的 @ExceptionHandler 方法来解析异常。另见 @ExceptionHandler 方法

解析器链

您可以通过在 Spring 配置中声明多个 HandlerExceptionResolver bean 并根据需要设置它们的 order 属性来形成一个异常解析器链。order 属性值越高,异常解析器的位置越靠后。

HandlerExceptionResolver 的合同规定它可以返回:

  • 一个指向错误视图的 ModelAndView

  • 如果异常在解析器内部被处理,则返回一个空的 ModelAndView

  • 如果异常仍然未解决,则返回 null,以便后续的解析器尝试,如果在最后异常仍然存在,则允许其冒泡到 Servlet 容器。

MVC Config 自动声明了默认 Spring MVC 异常的内置解析器,@ResponseStatus 注解的异常,以及对 @ExceptionHandler 方法的支持。您可以自定义该列表或替换它。

容器错误页面

如果任何 HandlerExceptionResolver 未能解决异常,因此让其传播,或者如果响应状态被设置为错误状态(即 4xx、5xx),Servlet 容器可以以 HTML 格式呈现默认错误页面。要自定义容器的默认错误页面,可以在 web.xml 中声明错误页面映射。以下示例展示了如何做到这一点:

<error-page>
<location>/error</location>
</error-page>
xml

根据前面的示例,当异常向上冒泡或响应具有错误状态时,Servlet 容器会在容器内对配置的 URL(例如,/error)进行 ERROR 调度。然后,这将由 DispatcherServlet 处理,可能映射到一个 @Controller,该控制器可以实现返回带有模型的错误视图名称或渲染 JSON 响应,如下例所示:

@RestController
public class ErrorController {

@RequestMapping(path = "/error")
public Map<String, Object> handle(HttpServletRequest request) {
Map<String, Object> map = new HashMap<>();
map.put("status", request.getAttribute("jakarta.servlet.error.status_code"));
map.put("reason", request.getAttribute("jakarta.servlet.error.message"));
return map;
}
}
java
提示

Servlet API 并不提供在 Java 中创建错误页面映射的方法。不过,您可以同时使用 WebApplicationInitializer 和一个最小的 web.xml