在這一章。 我們將討論如何處理JSP中的異常。當編寫JSP程式碼時,可能會導致程式碼錯誤發生在程式碼的任何部分。JSP程式碼中可能會出現以下型別的錯誤 -
檢查異常
檢查異常是一個例外,通常是使用者錯誤或程式員無法預見的問題。 例如,如果要開啟檔案,但找不到檔案,則會發生異常。編譯時不能簡單地忽略這些異常。
執行時異常
執行時異常是程式員可能避免的一種例外。與檢查異常相反,執行時異常在並行時被忽略。
錯誤
錯誤並不是例外,而是出現在使用者或程式員控制之外的問題。程式碼中通常會忽略錯誤,因為很少會對錯誤做任何事情。例如,如果發生堆疊溢位,則會出現錯誤。編譯時也會被忽略。
下面我們將進一步討論如何處理JSP程式碼中出現的執行時異常/錯誤。
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標籤來編寫錯誤頁面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.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