基於控制器的異常處理
在控制器丟擲異常的場景中,我們可以定義異常處理程式方法來構建並返回特定的響應。請務必注意,給定控制器中定義的異常處理程式僅適用於該控制器中發生的異常。
@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();
}
這允許你訪問引發異常的請求以及引發的異常。