JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Servlet/JSP 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 [Servlet/JSP 入門] JSP 錯誤處理 [精華]
caterpillar

良葛格

版主

發文: 2613
積分: 70
於 2004-05-11 18:19 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最新的文件在這邊:
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語法是否有錯誤,或是程式邏輯有明顯可讓編譯器檢查出的錯誤。

什麼是程式邏輯有明顯讓編譯器檢查出的錯誤?一個初學者較常犯但不容易檢查出的錯誤可能是「多餘的斷行」,例如:
1
2
3
4
5
<%@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是:
1
2
3
4
<%@page contentType="charset=Big5"  errorPage="errorhandler.jsp"%>
<%
    throw new Exception("這是一個假裝的錯誤,純綷丟出例外^_^");
%>


這個頁面只是純綷丟出一個我們自訂的例外,注意我們設定例外的處理頁面是errorhandler.jsp,它的內容是:
1
2
3
4
5
6
7
8
9
10
11
12
<%@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()方法來顯示例外堆疊追蹤。

這個例子的執行結果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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>


caterpillar edited on 2019-01-31 11:22
reply to postreply to post
良葛格學習筆記
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:caterpillar]
zsj306





發文: 3
積分: 0
於 2005-04-16 11:20 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
这样做对客户端很来说再好不过.

除此之为还可以在后台程序里写入:
System.out.println("errorMessage name and source");
这样的语句,错误会直接写入服务器中,很容易直接检测代码错误.

改之!


reply to postreply to post
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:caterpillar]
ahcol





發文: 16
積分: 0
於 2005-04-24 21:14 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
System.out.println("error info..");
适合很多情况,可以跟踪变量、查看程序是否执行到了期望的位置等

我一直用它


reply to postreply to post
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:caterpillar]
rogershi





發文: 2
積分: 0
於 2005-05-24 18:41 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
提个问题, 在真实的项目中, 这样的技术, 即error page, 这样赤裸裸的让最终用户看见错误堆栈什么的是合理的么?

我们项目中所做的是竭尽一切所能, 不能让页面抛出exception, 应该做的是, catch checked exception, 然后作出适当处理, 页面最终显示相应的提示信息..告诉最终用户, 某个操作出错应如何恢复, 或者这个出错是不可恢复的等等...


reply to postreply to post
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:caterpillar]
maomao8325





發文: 1
積分: 0
於 2005-09-01 17:18 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
对楼主这种查错方法还不很了解.用的多的还是System.out.print,在控制台检查执行情况...学习中Smile

reply to postreply to post
刚毕业的程序员,修炼中......
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:ahcol]
hkdennis2k





發文: 1926
積分: 6
於 2005-09-25 22:15 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
ahcol wrote:
System.out.println("error info..");
适合很多情况,可以跟踪变量、查看程序是否执行到了期望的位置等

我一直用它


但這是錯誤的做法....

development 時, 使用的是 debugger 的 breakpoint 功能

production 時, 使用正統的 Logging 介面才對 (servlet api 有提供的)
也可以選用 log4j 之類的

System.out is EVIL
synctonized...
bad performance
不能設 logging level
沒有系統...

我寫過一支 jsp, 把以前的 System.out 清除後,
負載減少了 90% 以上


hkdennis2k edited on 2005-09-25 22:38
reply to postreply to post
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:caterpillar]
renon





發文: 21
積分: 0
於 2005-12-28 10:07 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我都用file物件紀錄錯誤碼.

reply to postreply to post
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:renon]
ROACH





發文: 64
積分: 0
於 2006-01-24 15:30 user profilesend a private message to usersend email to ROACHreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
有時候錯誤的原因可能自己也稿不清楚在那
就用中斷法也可以哦~~

比如用下面的方式看看傳出來的參數正不正確!也可以把程式中斷在那邊

1
2
3
out.println(參數);
if( true )
 return; 


reply to postreply to post
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:caterpillar]
Ailsa





發文: 1
積分: 0
於 2006-03-08 16:34 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
为什么我的不能跳转到自定义的错误处理页面,而是到了blazix 的错误处理呢?
而且如果查看错误处理页面,还会报错,如下:

C:\Blazix\jspdir\ErrorHandle_jsp.java:24: 不兼容的类型
找到: java.lang.Object
需要: java.lang.Throwable
    Throwable exception = request.getAttribute( "javax.servlet.jsp.jspException" );
^
1 错误


reply to postreply to post
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:caterpillar]
180onwarding





發文: 3
積分: 0
於 2006-05-10 09:02 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
出现 ShowParameters.java:4:package javax.servlet does not exist import javax.servlet.http.*;错误提示是怎么回事啊,请求帮助!

reply to postreply to post
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:caterpillar]
zhldang





發文: 6
積分: 0
於 2006-11-10 22:00 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
个人认为这种方式还是不够灵活,还是在web.xml中定义错误异常更好些

reply to postreply to post
作者 Re:[JSP/Servlet入門]JSP錯誤處理 [Re:caterpillar]
richard_xu





發文: 1
積分: 0
於 2008-08-15 16:49 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
一般错误都是显示在log里面的,好追踪啊

让客户看到exception的页面,他就会简单的认为系统当掉了啊

所以我们一般不会让客户看到exception页面的


reply to postreply to post
» JWorld@TW »  Servlet/JSP 討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8