基于控制器的异常处理
在控制器抛出异常的场景中,我们可以定义异常处理程序方法来构建并返回特定的响应。请务必注意,给定控制器中定义的异常处理程序仅适用于该控制器中发生的异常。
@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
定义特定的异常处理程序,但 NullPointerException
是 Exception
的后代类。
此示例还说明了如何访问异常。在 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();
}
这允许你访问引发异常的请求以及引发的异常。