JSP 異常處理
jsp 異常處理
當(dāng)編寫jsp程序的時候,程序員可能會遺漏一些bug,這些bug可能會出現(xiàn)在程序的任何地方。jsp代碼中通常有以下幾類異常:
- 檢查型異常:檢查型異常就是一個典型的用戶錯誤或者一個程序員無法預(yù)見的錯誤。舉例來說,如果一個文件將要被打開,但是無法找到這個文件,則一個異常被拋出。這些異常不能在編譯期被簡單地忽略。
- 運行時異常:一個運行時異??赡芤呀?jīng)被程序員避免,這種異常在編譯期將會被忽略。
- 錯誤:錯誤不是異常,但問題是它超出了用戶或者程序員的控制范圍。錯誤通常會在代碼中被忽略,您幾乎不能拿它怎么樣。舉例來說,棧溢出錯誤。這些錯誤都會在編譯期被忽略。
本節(jié)將會給出幾個簡單而優(yōu)雅的方式來處理運行時異常和錯誤。
使用exception對象
exception對象是throwable子類的一個實例,只在錯誤頁面中可用。下表列出了throwable類中一些重要的方法:
序號 | 方法&描述 |
---|---|
1 | public string getmessage() 返回異常的信息。這個信息在throwable構(gòu)造函數(shù)中被初始化 |
2 | public throwablegetcause() 返回引起異常的原因,類型為throwable對象 |
3 | public string tostring() 返回類名 |
4 | public void printstacktrace() 將異常棧軌跡輸出至system.err |
5 | public stacktraceelement [] getstacktrace() 以棧軌跡元素數(shù)組的形式返回異常棧軌跡 |
6 | public throwablefillinstacktrace() 使用當(dāng)前棧軌跡填充throwable對象 |
jsp提供了可選項來為每個jsp頁面指定錯誤頁面。無論何時頁面拋出了異常,jsp容器都會自動地調(diào)用錯誤頁面。
接下來的例子為main.jsp指定了一個錯誤頁面。使用<%@page errorpage="xxxxx"%>指令指定一個錯誤頁面。
<%@ 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)在,編寫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編譯器需要產(chǎn)生一個異常實例變量。
現(xiàn)在試著訪問main.jsp頁面,它將會產(chǎn)生如下結(jié)果:
java.lang.runtimeexception: error condition!!! ...... opps... sorry, an error occurred. here is the exception stack trace:
在錯誤頁面中使用jstl標簽
可以利用jstl標簽來編寫錯誤頁面showerror.jsp。這個例子中的代碼與上例代碼的邏輯幾乎一樣,但是本例的代碼有更好的結(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>
運行結(jié)果如下:
使用 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,它將會產(chǎn)生如下結(jié)果:
an exception occurred: / by zero