ITEEDU

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
...
javax.servlet.ServletException
/servletex.jsp 
 ...

<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,您可以进一步进行不同的错误、

例外处理。