基于控制器的异常处理

在控制器抛出异常的场景中,我们可以定义异常处理程序方法来构建并返回特定的响应。请务必注意,给定控制器中定义的异常处理程序仅适用于该控制器中发生的异常。

@Controller
public class MyController {
    @GetMapping("/")
    public String somePage() throws Exception {
        // some set of code that can throw exceptions
    }

    @ExceptionHandler(Exception.class)
    public String genericErrorPage() {
        return "genericErrorView";
    }

    @ExceptionHandler(ChildException.class)
    public String childErrorPage(ChildException ex) {
        return "childErrorView with msg=" + ex.getMessage();
    }
}

如果定义了多个异常处理程序,则将选择具有最特定异常的方法。以上面的代码为例,如果抛出 ChildException,则会调用 childErrorPage() 方法。

假设一个 NullPointerException 被抛出。在这种情况下,将调用 genericErrorPage() 方法。这是因为没有为 NullPointerException 定义特定的异常处理程序,但 NullPointerExceptionException 的后代类。

此示例还说明了如何访问异常。在 childErrorPage 处理程序中,我们将 ChildException 作为参数传递。然后可以在处理程序的主体中使用它,如图所示。同样,你可以像这样定义该处理程序:

    @ExceptionHandler(ChildException.class)
    public String childErrorPage(HttpServletRequest req, ChildException ex) {
        // Both request and exception objects are now available
        return "childErrorView with msg=" + ex.getMessage();
    }

这允许你访问引发异常的请求以及引发的异常。