基於控制器的異常處理

在控制器丟擲異常的場景中,我們可以定義異常處理程式方法來構建並返回特定的響應。請務必注意,給定控制器中定義的異常處理程式僅適用於該控制器中發生的異常。

@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();
    }

這允許你訪問引發異常的請求以及引發的異常。