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