JSP的異常處理
以下內容引用自http://wiki.jikexueyuan.com/project/jsp/exception-handling.html:
當寫JSP代碼的時候,有可能會留下一個編碼錯誤,並且它會出現在代碼的任何一個部分。在JSP代碼中會有以下類型的錯誤:
-
檢測異常(Checked exceptions):一個檢測異常通常是一個用戶錯誤或者是一個有程序員無法預見的錯誤引起的異常。例如,如果要打開一個文件,但是無法找到該文件,這時就會出現異常。這些異常在編譯時不能簡單的忽略掉。
-
運行異常(Runtime exceptions):一個運行異常可能是程序員本來可以避免的一個異常。和檢測異常相反,運行異常在編譯時可以被忽略。
- 錯誤(Errors):這原本不是異常,是超出用戶或者程序員的控制而引起的問題。錯誤通常在代碼中會被忽略,因為對一個錯誤能夠做的很少。例如,如果一個堆棧發生溢出,那麽就會出現一個錯誤。在編譯時他們也會被忽略。
一、使用異常對象
異常對象是Throwable子類的一個實例(例如,java.lang.NullPointerException),它只能在錯誤頁面是可用的。下面是Throwable類中可用的重要方法的列表。
方法 | 描述 |
---|---|
public String getMessage() |
返回發生異常的詳細信息。這個消息是在Throwable構造函數裏初始化的。 |
public Throwable getCause() |
返回發生異常的原因,用一個Throwable對象表示。 |
public String toString() |
返回與getMessage()相連接的類名。 |
public void printStackTrace() |
輸出toString()和堆棧跟蹤的System.err的結果,錯誤輸出流。 |
public StackTraceElement [] getStackTrace() |
返回一個數組,其中包含堆棧跟蹤的每一個元素。索引值為0的元素表示調用堆棧的頂部, 數組中最後一個元素在調用堆棧的底部代表方法。 |
public Throwable fillInStackTrace() |
用當前的堆棧跟蹤填滿Throwable對象的堆棧跟蹤,添加任何先前的堆棧跟蹤信息。 |
JSP會給一個選項來指定每一個JSP的錯誤頁面。不管何時頁面拋出一個異常,JSP容器都會自動的調用錯誤頁面。
下面是main.jsp中一個特定錯誤頁面的例子。為了創建一個錯誤頁面,使用<%@ page errorPage=”xxx”%>指令。
<%@ page errorPage="ShowError.jsp" %> <html> <head> <title>Error Handling Example</title> </head> <body> <% // Throw an exception to invoke the error page int x = 1; if (x == 1) { throw new RuntimeException("Error condition!!!"); } %> </body> </html>
現在需要寫一個錯誤處理的JSP:ShowError.jsp,下面給出了代碼。註意,錯誤處理頁面包括<%@ page isErrorPage=”true”%>指令。這個指令使JSP編譯器生成異常實例變量。
<%@ page isErrorPage="true" %> <html> <head> <title>Show Error Page</title> </head> <body> <h1>Opps...</h1> <p>Sorry, an error occurred.</p> <p>Here is the exception stack trace: </p> <pre> <% exception.printStackTrace(response.getWriter()); %> </pre> </body> </html>
現在試圖訪問main.jsp,它將會生成如下結果:
二、在錯誤頁面使用JSTL標簽
可以使用JSTL標簽來編寫一個錯誤頁面ShowError.jsp。這個頁面和上面的例子中幾乎使用的是相同的邏輯,但是它有更好的結構,並且他提供了更多的信息:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page isErrorPage="true" %> <html> <head> <title>Show Error Page</title> </head> <body> <h1>Opps...</h1> <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>
現在試圖訪問main.jsp,它將會生成如下結果:
三、使用Try...Catch塊
如果想要在同一個頁面中處理錯誤,使用一些動作而不是釋放一個錯誤頁面,那麽可以利用Try...catch塊。
下面顯示的是如何使用try...catch塊的一個簡單的例子。將下面的代碼放到main.jsp中:
<html> <head> <title>Try...Catch Example</title> </head> <body> <% try{ int i = 1; i = i / 0; out.println("The answer is " + i); } catch (Exception e){ out.println("An exception occurred: " + e.getMessage()); } %> </body> </html>
現在試圖訪問main.jsp,它將會生成如下結果:
測試工程:https://github.com/easonjim/5_java_example/tree/master/jspbasics/test22
JSP的異常處理