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,將收到一個類似於以下內容的輸出 -

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,將收到一個類似於以下內容的輸出 -

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