JSP例外處理


在這一章。 我們將討論如何處理JSP中的異常。當編寫JSP程式碼時,可能會導致程式碼錯誤發生在程式碼的任何部分。JSP程式碼中可能會出現以下型別的錯誤 -

檢查異常

檢查異常是一個例外,通常是使用者錯誤或程式員無法預見的問題。 例如,如果要開啟檔案,但找不到檔案,則會發生異常。編譯時不能簡單地忽略這些異常。

執行時異常

執行時異常是程式員可能避免的一種例外。與檢查異常相反,執行時異常在並行時被忽略。

錯誤

錯誤並不是例外,而是出現在使用者或程式員控制之外的問題。程式碼中通常會忽略錯誤,因為很少會對錯誤做任何事情。例如,如果發生堆疊溢位,則會出現錯誤。編譯時也會被忽略。

下面我們將進一步討論如何處理JSP程式碼中出現的執行時異常/錯誤。

使用Exception物件

Exception物件是Throwable子類的一個範例(例如,java.lang.NullPointerException),僅在錯誤頁面中可用。下表列出了Throwable類中可用的重要方法。

編號 方法 描述
1 public String getMessage() 返回有關發生的異常的詳細訊息。此訊息在Throwable建構函式中初始化。
2 public Throwable getCause() 返回由Throwable物件表示的異常的原因。
3 public String toString() 返回與getMessage()的結果連線的類的名稱。
4 public void printStackTrace() toString()的結果與堆疊跟蹤一起列印到System.err錯誤輸出流。
5 public StackTraceElement [] getStackTrace() 返回一個包含堆疊跟蹤中每個元素的陣列。索引0處的元素表示呼叫堆疊的頂部,陣列中的最後一個元素表示呼叫堆疊底部的方法。
6 public Throwable fillInStackTrace() 使用當前堆疊跟蹤填充Throwable物件的堆疊跟蹤,新增堆疊跟蹤中的任何先前資訊。

JSP提供了一個選項用來為每個JSP指定錯誤頁面。每當頁面引發異常時,JSP容器將自動呼叫錯誤頁面。

以下是一個範例來指定index.jsp的錯誤頁面。要設定錯誤頁面,請使用<%@ page errorPage =「xxx」%>指令。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page errorPage="ErrorPage.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>錯誤頁面範例</title>
</head>
<body>
    <%
        // Throw an exception to invoke the error page
        int x = 1;

        if (x == 1) {
            throw new RuntimeException("Error condition!!!");
        }
    %>
</body>
</html>

現在編寫一個錯誤處理ErrorPage.jsp,如下所示。 請注意,錯誤處理頁面包含指令<%@ page isErrorPage =「true」%>。 該指令使JSP編譯器生成異常範例變數。

檔案:**

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>錯誤顯示頁面</title>
</head>
<body>
    <h2>錯誤顯示頁面...</h2>
    <p>Sorry, an error occurred.</p>
    <p>Here is the exception stack trace:</p>
    <pre>
        <%
            exception.printStackTrace(response.getWriter());
        %>
    </pre>
</body>
</html>

存取index.jsp,將收到一個類似於以下內容的輸出 -

使用JSTL標籤編寫錯誤頁面

可以使用JSTL標籤來編寫錯誤頁面ErrorPage2.jsp。 該頁面具有與上述範例中具有差不多相同的邏輯,具有更好的結構和更多資訊 -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>錯誤顯示頁面</title>
</head>
<body>
    <h2>錯誤顯示頁面...</h2>
    <table width="100%" border="1">
        <tr valign="top">
            <td width="40%"><b>Error:</b></td>
            <td>${pageContext.exception}</td>
        </tr>

        <tr valign="top">
            <td><b>URI:</b></td>
            <td>${pageContext.errorData.requestURI}</td>
        </tr>

        <tr valign="top">
            <td><b>Status code:</b></td>
            <td>${pageContext.errorData.statusCode}</td>
        </tr>

        <tr valign="top">
            <td><b>Stack trace:</b></td>
            <td><c:forEach var="trace"
                    items="${pageContext.exception.stackTrace}">
                    <p>${trace}</p>
                </c:forEach></td>
        </tr>
    </table>
</body>
</html>

存取index.jsp,將收到一個類似於以下內容的輸出 -

使用try…catch塊

如果要處理同一頁面中的錯誤,並希望採取一些措施,而不是觸發錯誤頁面,則可以使用try....catch塊。

以下是一個簡單的例子,顯示如何使用try...catch塊。把下面的程式碼放在try-catch.jsp中 -

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Try...Catch範例</title>
</head>
<body>
    <div style="margin: auto; width: 90%">
        <%
            try {
                int i = 1;
                i = i / 0;
                out.println("The answer is " + i);
            } catch (Exception e) {
                out.println("An exception occurred: " + e.getMessage());
            }
        %>
    </div>
</body>
</html>

存取http://localhost:8080/ExceptionHandling/try-catch.jsp,它應該生成一個類似於以下內容的輸出 -

An exception occurred: / by zero