<%@page contentType="charset=Big5" errorPage="errorhandler.jsp"%>
<%
throw new Exception("這是一個假裝的錯誤,純綷丟出例外^_^");
%>
這個JSP程式乍看之下沒有錯誤,我們只是丟出一個例外而已,但注意到它最底下空了一行,在轉換為Servlet之後,這一行會實際轉換為out.write('\r');,而在這行之前,我們直接丟出了一個例外,換句話說,out.write('\r');這行永遠不會被執行到,這個邏輯錯誤,編譯器是可以檢查的出的,因而錯誤頁面會回報"unreachable statement",改正這個錯誤的方式,是將JSP頁面中多餘的斷行刪掉。
如果編譯過後的Servlet在使用者請求之後,在運行過程中產生了錯誤而丟出例外,這個例外如果沒有被處理,則最後會由Container處理,而Container再將訊息交由Server傳回給客戶端,基本上也是會出現"....encountered an internal error....",不過在回報頁面中還會出現例外的堆疊追蹤訊息,依此您可以判斷應該是Client Request Time Processing Errors。
您也可以自訂例外發生時的處理方式,只要使用page指令元素時,設定屬性errorPage指定錯誤處理的JSP頁面,而錯誤處理的JSP頁面則設定isErrorPage屬性為true即可,例如我們的示範頁面errordemo.jsp是:
<%@page contentType="charset=Big5" errorPage="errorhandler.jsp"%>
<%
throw new Exception("這是一個假裝的錯誤,純綷丟出例外^_^");
%>
這個頁面只是純綷丟出一個我們自訂的例外,注意我們設定例外的處理頁面是errorhandler.jsp,它的內容是:
<%@page contentType="text/html;charset=Big5" isErrorPage="true"%>
<%@page import="java.io.PrintWriter"%>
<html>
<head><title>錯誤處理頁面</title></head>
<body>
<H1>網頁發生錯誤:</H1><%=exception%>
<H2>顯示例外堆疊追蹤:</H2>
<%
exception.printStackTrace(new PrintWriter(out));
%>
</body>
</html>
exception物件是JSP的隱含物件,由errordemo.jsp丟出的例外物件訊息就包括在exception之中,我們先簡單的顯示toString()之後的訊息,也就是<%=exception%>顯示的內容;另外我們也可以將例外堆疊追蹤顯示出來,printStackTrace()接受一個PrintWriter物件作為參數,所以我們將out隱含物件(它是JspWriter)裝飾為PrintWriter物件,如此使用exception的printStackTrace()方法來顯示例外堆疊追蹤。
這個例子的執行結果如下:
<html>
<head><title>錯誤處理頁面</title></head>
<body>
<h1>網頁發生錯誤:</h1>java.lang.Exception: 這是一個假裝的錯誤,純綷丟出例外^_^
<h2>顯示例外堆疊追蹤:</h2>
java.lang.Exception: 這是一個假裝的錯誤,純綷丟出例外^_^
at org.apache.jsp.errordemo_jsp._jspService(errordemo_jsp.java:45)
at
......... 略
at java.lang.Thread.run(Thread.java:534)
</body>
</html>
本文地址:http://com.8s8s.com/it/it11756.htm