JSP異常處理
當寫JSP代碼,程序員可能會留下它可以發生在任何部分代碼的編碼錯誤。有以下的錯誤類型在JSP代碼:
-
檢查異常: 檢查異常是一個例外,通常是用戶錯誤或不能由程序員不可預見的問題。例如,如果一個文件被打開,但該文件無法找到,則會出現異常。這些例外並不能簡單地在編譯時被忽略。
-
運行時異常: 運行時異常是發生,大概本來是可以由編程人員避免異常。而不是檢查異常,運行時異常是在編譯時忽略不計。
-
錯誤: 這些都不是例外,但所出現超出用戶或程序員的控製問題。錯誤通常忽略了代碼,因為你可以減少做有關的錯誤。例如,如果發生堆棧溢出時,會產生一個錯誤。但在編譯的時候還是被忽略了。
本教學會給你一些簡單而優雅的方式來處理運行時產生在JSP代碼異常/錯誤。
使用異常對象:
異常對象是可拋出(例如,java.lang. NullPointerException)的一個子類的實例,並僅在錯誤頁麵使用。以下是在Throwable類中提供重要方法列表。
SN | 方法和描述 |
---|---|
1 |
public String getMessage() Returns a detailed message about the exception that has occurred. This message is initialized in the Throwable constructor. |
2 |
public Throwable getCause() Returns the cause of the exception as represented by a Throwable object. |
3 |
public String toString() Returns the name of the class concatenated with the result of getMessage() |
4 |
public void printStackTrace() Prints the result of toString() along with the stack trace to System.err, the error output stream. |
5 |
public StackTraceElement [] getStackTrace() Returns an array containing each element on the stack trace. The element at index 0 represents the top of the call stack, and the last element in the array represents the method at the bottom of the call stack. |
6 |
public Throwable fillInStackTrace() Fills the stack trace of this Throwable object with the current stack trace, adding to any previous information in the stack trace. |
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,它應該產生的東西如下:
java.lang.RuntimeException: Error condition!!! ...... Opps... Sorry, an error occurred. Here is the exception stack trace:
使用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,它應該產生的東西如下:
Opps...
|
使用 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,它應該產生的東西如下:
An exception occurred: / by zero