From Gossip@caterpillar

JSP/Servlet: exception

 

 


exception 隱含物件在轉換為Servlet之後,會對應至java.lang.Throwable型態的物件,也就是例外處理相關物件,只要您對Java例外處理有認識,就應當知道如何使用exception的各種方法,這邊則由exception為標題,實際上在介紹如何於web.xml中規劃錯誤處理網頁,以及在發生對應的例外發生時呼叫對應的例外處理網頁。

伺服器發現錯誤時,會有自己的一套錯誤訊息網頁以供回應,例如在發生404 Not Found之類的錯誤時,IIS、Apache、Tomcat等都會有各自不同的網頁來回應客戶端,而為了要在不同的伺服器有一致的錯誤處理頁面外觀,您 也可以自行規劃錯誤訊息處理網頁,將伺服器的那一套替換掉,使用自行的規畫,實際在web.xml中加入以下的標籤作示範:

  • web.xml
...
<error-page>
<error-code>400</error-code>
<location>/400.html</location>
</error-page>

<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
...

上面的設定會在伺服器發生相對應的錯誤時,呼叫對應的網頁(可以是靜態或動態的網頁),例如發生404 Not Found時,就會傳回404.html給客戶端,不過有些瀏覽器會有自己的錯誤訊息網頁,例如Internet Explorer在接收到404 Not Found時,會使用自己的錯誤訊息來顯示給操作者看。

之前曾示範過如何在page指令元素中設定例外處理網頁,並利用exception物件來顯示相關訊息,這邊介紹另一種方式,首先您要知道任何被 Servlet丟出來的例外物件如果沒有被Servlet處理,則伺服器會負責處理它,處理的方式視不同的伺服器而定,如果您想要在發生例外時,能有一致 的處理方式,即使是Servlet被部署在不同的伺服器上,最好是自行處理例外,處理例外的方式可以使用try-catch-finally 或是之前介紹的例外處理網頁設定,這是在Servlet內處理例外的方式,如果要將例外丟給伺服器處理,而又要自訂處理回應頁面,則也可以在 web.xml中設定,例如在web.xml中加入以下的內容:

  • web.xml
...
<error-page>
<exception-type>
javax.servlet.ServletException
</exception-type>
<location>/servletex.jsp</location>
</error-page>
...

<exception-type>中必須設定例外類別的完整套件名稱,而<location>所指的對象可以是靜態網頁,或是動 態網頁,如果要利用exception接收例外訊息,則必須設定page指令元素的isErrorPage屬性為true,例如:
  • servletex.jsp
<%@page contentType="text/html;charset=Big5"  
isErrorPage="true"%>
<html>
<head><title>ServletException例外處理頁面</title></head>
<body>
<H1>網頁發生錯誤:</H1><%=exception%>
<H2>顯示例外堆疊追蹤:</H2>
<%
exception.printStackTrace(response.getWriter());
%>
</body>
</html>

通常處理例外的網頁是動態網頁,您可以設計一個通用的動態網頁,讓相關錯誤訊息、例外處理都由它來處理,以產生一致的外觀,例如在web.xml中這麼寫:
  • web.xml
... 
<error-page>
<error-code>404</error-code>
<location>/errorhandler.jsp</location>
</error-page>

<error-page>
<exception-type>
javax.servlet.ServletException
</exception-type>
<location>/errorhandler.jsp</location>
</error-page>
...

您可以使用下面的網頁來取得相關訊息,並進一步修改為通用的錯誤處理網頁:
  • errorhandler.jsp
<%@page contentType="text/html;charset=Big5" 
isErrorPage="true"%>
<html>
<head><title>錯誤與例外處理頁面</title></head>
<body>
錯誤碼: <%=request.getAttribute(
"javax.servlet.error.status_code")%>
<br>
訊息: <%=request.getAttribute("
javax.servlet.error.message")%>
<br>
例外: <%=request.getAttribute("
javax.servlet.error.exception_type")%>
<br>
</body>
</html>

request的getAttribute()可以取得儲存在其中的相關屬性,依status_code、message、與 exception_type,您可以進一步進行不同的錯誤、例外處理。