exception对象的一个教程
JSP引擎在执行编译好的代码时,有可能会抛出异常。exception对象表示的就是JSP引擎在执行代码时抛出的异常。
|
如果你希望在JSP程序中使用exception对象,那么你必须定义page编译指令的isErrorPage属性值等于true,否则不能够使用exception对象。 |
exception对象可以使用的主要方法如下所示。
l getMessage():该方法返回错误信息。
l printStackTrace():该方法以标准错误的形式输出一个错误和错误的堆栈。
l toString():该方法以字符串的形式返回一个对异常的描述。
exception对象可以配合后面章节将要介绍的page编译指令元素一起使用,通过指定某一个JSP程序为错误处理程序,把所有的错误/异常都集中到那个程序进行处理,这样可以使得整个程序的健壮性得到加强,也使得程序的流程更加简单明晰,这也是JSP比ASP、PHP优越的地方之一。
如果某个JSP页面在执行的过程中出现了错误,那么JSP引擎会自动产生一个异常对象,如果这个JSP页面指定了另一个JSP页面为错误处理程序,那么JSP引擎会将这个异常对象放入到request对象中,传到错误处理程序中,在错误处理程序里,因为page编译指令的isErrorPage属性的值被设为true,那么JSP引擎会自动声明一个exception对象,这个exception对象从request对象所包含的HTTP参数中获得:
Throwable exception=(Throwable)request.getAttribute
("javax.servlet.jspException");
事实上,javax.servlet.jspException是JSP引擎为exception对象所取的名字,并不存在所谓的jspException类,exception对象实际上是java.lang.Throwable类的实例对象。
下面的程序4-9和程序4-10分别演示了exception对象的使用方法。程序4-9中首先引发一个Java异常事件,使得当前JSP页面定向到指定的错误处理程序——程序4-10,并且在该页面中将错误信息输出。
【程序4-9】errorthrow1.jsp
01 <%@ page language="java" import="java.util.*"
02 pageEncoding="ISO-8859-1" errorPage=”error.jsp”%>
03 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
04 <html>
05 <body>
06 <%
07 int result=1/0;
08 %>
09 </body>
10 </html>
程序4-9在执行时,将会引发一个除数为零的异常,并指定该异常由程序4-10进行处理。
【程序4-10】error.jsp
01 <%@ page language="java" import="java.util.*"
02 pageEncoding="ISO-8859-1" isErrorPage="true"%>
03 <%
04 String path = request.getContextPath();
05 String basePath = request.getScheme() + "://" + request.getServerName() + ":" +
06 request.getServerPort()+path+"/";
07 %>
08 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
09 <html>
10 <head>
11 <title>My JSP 'error.jsp' starting page</title>
12 </head>
13 <body>
14 Error Message:getMessage() Method<br>
15 <%
16 out.println(exception.getMessage());
17 %>
18 <br><br>
19 Error String:toString() Method<br>
20 <%
21 out.println(exception.toString());
22 %>
23 </body>
24 </html>
程序4-10使用exception对象的getMessage()方法和toString()方法输出错误的具体信息。程序4-9和程序4-10的运行效果如图4-9所示。
图4-9 errorthrow1.jsp的运行效果
如果在程序4-9中使用try、catch块捕捉异常事件的发生,那么就不会有异常对象被传递给error.jsp页面程序,也就是说错误处理程序没有被调用,修改后如程序4-11所示。
【程序4-11】errorthrow2.jsp
01 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
02 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
03 <html>
04 <head>
05 <title>My JSP 'error.jsp' starting page</title>
06 </head>
07 <body>
08 <%
09 try
10 {
11 int result=1/0;
12 }
13 catch(Exception e)
14 {
15 out.println(“errorthrow2.jsp:”+e.getMessage());
16 }
17 %>
18 </body>
19 </html>
程序4-11的运行效果如图4-10所示,很明显,error.jsp页面并没有被调用。
图4-10 errorthrow2.jsp的运行效果