跳到主要内容

异常

ChatGPT-4o-mini 中英对照 Exceptions

@Controller@ControllerAdvice 类可以有 @ExceptionHandler 方法来处理来自控制器方法的异常。以下示例包含这样一个处理方法:

import java.io.IOException;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;

@Controller
public class SimpleController {

@ExceptionHandler(IOException.class)
public ResponseEntity<String> handle() {
return ResponseEntity.internalServerError().body("Could not read file storage");
}

}
java

该异常可以与正在传播的顶级异常匹配(即,直接抛出的 IOException)或与顶级包装异常中的直接原因匹配(例如,包装在 IllegalStateException 中的 IOException)。

对于匹配异常类型,最好将目标异常声明为方法参数,如前面的示例所示。或者,注解声明可以缩小异常类型以进行匹配。我们通常建议在参数签名中尽可能具体,并在 @ControllerAdvice 上声明您的主要根异常映射,并根据相应的顺序进行优先级设置。有关详细信息,请参见 MVC 部分

备注

一个 @ExceptionHandler 方法在 WebFlux 中支持与 @RequestMapping 方法相同的方法参数和返回值,唯一的例外是请求体和 @ModelAttribute 相关的方法参数。

@ExceptionHandler 方法的支持在 Spring WebFlux 中由 @RequestMapping 方法的 HandlerAdapter 提供。有关更多详细信息,请参见 DispatcherHandler

媒体类型映射

除了异常类型,@ExceptionHandler 方法还可以声明可生成的媒体类型。这允许根据 HTTP 客户端请求的媒体类型(通常在 "Accept" HTTP 请求头中)来细化错误响应。

应用程序可以直接在注释上声明可生成的媒体类型,针对相同的异常类型:

@ExceptionHandler(produces = "application/json")
public ResponseEntity<ErrorMessage> handleJson(IllegalArgumentException exc) {
return ResponseEntity.badRequest().body(new ErrorMessage(exc.getMessage(), 42));
}

@ExceptionHandler(produces = "text/html")
public String handle(IllegalArgumentException exc, Model model) {
model.addAttribute("error", new ErrorMessage(exc.getMessage(), 42));
return "errorView";
}
java

在这里,方法处理相同的异常类型,但不会被视为重复。相反,请求 "application/json" 的 API 客户端将收到一个 JSON 错误,而浏览器将获得一个 HTML 错误视图。每个 @ExceptionHandler 注解可以声明多个可生成的媒体类型,在错误处理阶段的内容协商将决定使用哪种内容类型。

方法参数

@ExceptionHandler 方法支持与 @RequestMapping 方法相同的 方法参数,但请求体可能已经被消费。

返回值

@ExceptionHandler 方法支持与 @RequestMapping 方法相同的 返回值