註冊 | 登入 | 全文檢索 | 排行榜 |
» JWorld@TW
» Servlet/JSP 討論區
![]() ![]() |
![]() ![]() ![]() ![]() |
本主題所含的標籤 |
作者 | [Servlet/JSP 入門] JSP 錯誤處理 [精華] | ||||||||
caterpillar
![]() 良葛格 版主 ![]() 發文: 2613 積分: 70 ![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() 最新的文件在這邊: https://openhome.cc/Gossip/ServletJSP/HandleError.html 以下是舊的文件了。。XD ==== 剛開始撰寫JSP時,總是會被JSP的除錯訊息所困擾,如果沒有稍微瞭解JSP與Servlet之間運作關係的初學者,所看到的只是一堆除錯訊息,甚至例外發生的訊息,這些訊息雖然包括詳細的錯誤訊息,但對於初學者而言卻是不友善、不易閱讀理解的。基本上,只要瞭解JSP與Servlet之間的運作關係,並瞭解Java編譯訊息與例外處理,要瞭解在撰寫JSP網頁時,因錯誤而產生的錯誤報告頁面就不是件難事。 我們知道JSP終究會轉換為Servlet,而運行時真正動作的是Servlet類,所以錯誤可能發生在兩個時候:一個是JSP轉換為Servlet原始碼時,因為JSP語法錯誤而導致無法生成Servlet原始碼,或是已轉換為Servlet程式碼,但編譯時編譯器檢查出錯誤,這稱之為Translation Time Processing Errors;第二個錯誤發生的時期在於客戶請求執行Servlet時,因為程式邏輯或運行時未考慮到的錯誤而產生例外,這稱之為Client Request Time Processing Errors。 如何在JSP運行時判別錯誤發生的種類?如果錯誤報告頁面出現"....encountered an internal error....",就有可能是轉換時期錯誤,或是"Generated servlet error: [javac] Compiling 1 source file....",就有可能是編譯器在編譯Servlet程式碼時發現錯誤,這個時候您必須檢查一下JSP語法是否有錯誤,或是程式邏輯有明顯可讓編譯器檢查出的錯誤。 什麼是程式邏輯有明顯讓編譯器檢查出的錯誤?一個初學者較常犯但不容易檢查出的錯誤可能是「多餘的斷行」,例如:
這個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是:
這個頁面只是純綷丟出一個我們自訂的例外,注意我們設定例外的處理頁面是errorhandler.jsp,它的內容是:
exception物件是JSP的隱含物件,由errordemo.jsp丟出的例外物件訊息就包括在exception之中,我們先簡單的顯示toString()之後的訊息,也就是<%=exception%>顯示的內容;另外我們也可以將例外堆疊追蹤顯示出來,printStackTrace()接受一個PrintWriter物件作為參數,所以我們將out隱含物件(它是JspWriter)裝飾為PrintWriter物件,如此使用exception的printStackTrace()方法來顯示例外堆疊追蹤。 這個例子的執行結果如下:
![]() ![]() 良葛格學習筆記 |
話題樹型展開 |
人氣 | 標題 | 作者 | 字數 | 發文時間 |
39152 |
![]() | caterpillar | 2679 | 2004-05-11 18:19 |
30866 |
![]() ![]() | zsj306 | 290 | 2005-04-16 11:20 |
30605 |
![]() ![]() | ahcol | 104 | 2005-04-24 21:14 |
27926 |
![]() ![]() ![]() | hkdennis2k | 386 | 2005-09-25 22:15 |
31008 |
![]() ![]() | rogershi | 475 | 2005-05-24 18:41 |
28153 |
![]() ![]() | maomao8325 | 56 | 2005-09-01 17:18 |
26300 |
![]() ![]() | renon | 15 | 2005-12-28 10:07 |
25534 |
![]() ![]() ![]() | ROACH | 128 | 2006-01-24 15:30 |
24905 |
![]() ![]() | Ailsa | 311 | 2006-03-08 16:34 |
24084 |
![]() ![]() | 180onwarding | 106 | 2006-05-10 09:02 |
22210 |
![]() ![]() | zhldang | 35 | 2006-11-10 22:00 |
12479 |
![]() ![]() | richard_xu | 85 | 2008-08-15 16:49 |
» JWorld@TW » Servlet/JSP 討論區 |
![]() ![]() ![]() ![]() |
![]() ![]() ![]() |