JSP 異常處理
當(dāng)編寫(xiě)JSP程序的時(shí)候,程序員可能會(huì)遺漏一些BUG,這些BUG可能會(huì)出現(xiàn)在程序的任何地方。JSP代碼中通常有以下幾類(lèi)異常:
檢查型異常:檢查型異常就是一個(gè)典型的用戶(hù)錯(cuò)誤或者一個(gè)程序員無(wú)法預(yù)見(jiàn)的錯(cuò)誤。舉例來(lái)說(shuō),如果一個(gè)文件將要被打開(kāi),但是無(wú)法找到這個(gè)文件,則一個(gè)異常被拋出。這些異常不能再編譯期被簡(jiǎn)單地忽略。
運(yùn)行時(shí)異常:一個(gè)運(yùn)行時(shí)異??赡芤呀?jīng)被程序員避免,這種異常在編譯期將會(huì)被忽略。
錯(cuò)誤:這里沒(méi)有異常,但問(wèn)題是它超出了用戶(hù)或者程序員的控制范圍。錯(cuò)誤通常會(huì)在代碼中被忽略,您幾乎不能拿它怎么樣。舉例來(lái)或,棧溢出錯(cuò)誤。這些錯(cuò)誤都會(huì)在編譯期被忽略。
本節(jié)將會(huì)給出幾個(gè)簡(jiǎn)單而優(yōu)雅的方式來(lái)處理運(yùn)行時(shí)異常和錯(cuò)誤。
使用Exception對(duì)象
exception對(duì)象是Throwable子類(lèi)的一個(gè)實(shí)例,只在錯(cuò)誤頁(yè)面中可用。下表列出了Throwable類(lèi)中一些重要的方法:
序號(hào) | 方法&描述 |
---|---|
1 | public String getMessage() |
2 | public ThrowablegetCause() |
3 | public String toString() |
4 | public void printStackTrace() |
5 | public StackTraceElement [] getStackTrace() |
6 | public ThrowablefillInStackTrace() |
JSP提供了可選項(xiàng)來(lái)為每個(gè)JSP頁(yè)面指定錯(cuò)誤頁(yè)面。無(wú)論何時(shí)頁(yè)面拋出了異常,JSP容器都會(huì)自動(dòng)地調(diào)用錯(cuò)誤頁(yè)面。
接下來(lái)的例子為main.jsp指定了一個(gè)錯(cuò)誤頁(yè)面。使用<%@page errorPage="XXXXX"%>指令指定一個(gè)錯(cuò)誤頁(yè)面。
<%@ 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>
現(xiàn)在,編寫(xiě)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"%>指令,這個(gè)指令告訴JSP編譯器需要產(chǎn)生一個(gè)異常實(shí)例變量。
現(xiàn)在試著訪問(wèn)main.jsp頁(yè)面,它將會(huì)產(chǎn)生如下結(jié)果:
java.lang.RuntimeException: Error condition!!! ...... Opps... Sorry, an error occurred. Here is the exception stack trace:
在錯(cuò)誤頁(yè)面中使用JSTL標(biāo)簽
可以利用JSTL標(biāo)簽來(lái)編寫(xiě)錯(cuò)誤頁(yè)面ShowError.jsp。這個(gè)例子中的代碼與上例代碼的邏輯幾乎一樣,但是本例的代碼有更好的結(jié)構(gòu),并且能夠提供更多信息:
<%@ 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>
運(yùn)行結(jié)果如下:
使用 try…catch塊
如果您想要將異常處理放在一個(gè)頁(yè)面中,并且對(duì)不同的異常進(jìn)行不同的處理,那么您就需要使用try…catch塊了。
接下來(lái)的這個(gè)例子顯示了如何使用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>
試著訪問(wèn)main.jsp,它將會(huì)產(chǎn)生如下結(jié)果:
An exception occurred: / by zero