當編寫JSP程序的時候,程序員可能會遺漏一些BUG,這些BUG可能會出如今程序的任何地方。JSP代碼中一般有如下幾類異常:html
本節將會給出幾個簡單而優雅的方式來處理運行時異常和錯誤。java
exception對象是Throwable子類的一個實例,只在錯誤頁面中可用。下表列出了Throwable類中一些重要的方法:程序員
序號 | 方法&描述 |
---|---|
1 | public String getMessage() 返回異常的信息。這個信息在Throwable構造函數中被初始化 |
2 | public ThrowablegetCause() 返回引發異常的緣由,類型爲Throwable對象 |
3 | public String toString() 返回類名 |
4 | public void printStackTrace() 將異常棧軌跡輸出至System.err |
5 | public StackTraceElement [] getStackTrace() 以棧軌跡元素數組的形式返回異常棧軌跡 |
6 | public ThrowablefillInStackTrace() 使用當前棧軌跡填充Throwable對象 |
JSP提供了可選項來爲每一個JSP頁面指定錯誤頁面。不管什麼時候頁面拋出了異常,JSP容器都會自動地調用錯誤頁面。數組
接下來的例子爲main.jsp指定了一個錯誤頁面。使用<%@page errorPage="XXXXX"%>指令指定一個錯誤頁面。jsp
<%@ 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>
如今,編寫ShowError.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()); %>
注意到,ShowError.jsp文件使用了<%@page isErrorPage="true"%>指令,這個指令告訴JSP編譯器須要產生一個異常實例變量。spa
如今試着訪問main.jsp頁面,它將會產生以下結果:.net
java.lang.RuntimeException: Error condition!!! ...... Opps... Sorry, an error occurred. Here is the exception stack trace:
能夠利用JSTL標籤來編寫錯誤頁面ShowError.jsp。這個例子中的代碼與上例代碼的邏輯幾乎同樣,可是本例的代碼有更好的結構,而且可以提供更多信息:code
<%@ 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>
運行結果以下:htm
若是您想要將異常處理放在一個頁面中,而且對不一樣的異常進行不一樣的處理,那麼您就須要使用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