錯誤處理標籤


在〈簡介 EL〉中曾使用一個簡單的加法網頁來示範。在該範例中使用了 errorPage="error.jsp" 設定當錯誤發生時,轉發至 error.jsp 顯示錯誤,若使用者輸入的並非數字時,EL 無法進行剖析為基本型態進行加法時,就會發生錯誤,而轉發 error.jsp。

如果你不想在錯誤發生時,轉發其它網頁來顯示錯誤訊息,而打算在目前網頁捕捉例外,並顯示相關訊息,那該如何進行?

這個問題的答案似乎很簡單,撰寫 Scriptlet,在當中使用 Java 的 try-catch 語法捕捉例外就可以解決這個需求。不過可以的話實在不希望再出現 Scriptlet,那該怎麼辦?

你可以使用 JSTL 的 <c:catch> 標籤:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>加法網頁</title>
    </head>
    <body>
        <c:catch var="error">
            ${param.a} + ${param.b} = ${param.a + param.b}
        </c:catch>
        <c:if test="${error != null}">
            <br><span style="color: red;">${error.message}</span>
            <br>${error}
        </c:if>
    </body>
</html> 

如果要在發生例外的網頁直接捕捉例外物件,可以使用 <c:catch> 將可能產生例外的網頁段落包起來。若例外真的發生,這個例外物件會設定給 var 屬性所指定的名稱,這樣才有機會使用這個例外物件。

例如範例中,使用了 <c:if> 標籤測試 error 是否參考至例外物件,如果是的話,由於例外都是 Throwable 的子類別,都擁有 getMessage() 方法,因此才能透過 ${error.message} 的方式取得例外相關訊息。

注意!只有設定 isErrorPage="true" 的JSP網頁才會有 exception 隱含物件,代表錯誤發生的來源網頁所傳進來的 Throwable 物件,所以不可以在上面的範例中,直接使用 exception 隱含物件。