exception对象是Throwable实例,代表JSP脚本中产生的错误和异常,是JSP页面机制的一部分。在JSP脚本中无须处理异常,即使该异常时checked异常。实际上,JSP脚本所包含的所有可能出现的异常都可以交给错误处理页面进行处理。
看如下的异常处理结构:
try { //代码处理段 } catch(Exception exception) { //异常处理段 }
这是典型的异常处理捕捉模块。在JSP页面,在普通的JSP脚本只是执行第一部分即代码处理段;而异常处理页面处理第二个部分即异常处理段。在异常处理段中可以看到一个异常对象,该对象就是内置对象exception。
注意:exception对象仅仅在异常处理页面中在有效。
打开普通页面所生成的Servlet类。将发现以下代码段:
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException{ try { //所有JSP脚本、静态HTML部分都会转换成此部分代码 response.setContentType("text/html;charset = gb2132"); ... out.write("</BODY>\r\n"); out.write("</HTML>\r\n"); } catch ( Throwable t ) { //处理该异常 if ( _jspx_page_context != null ) _jspx_page_context.handlePageException(t); } finally { //释放资源 _jspxFactory.releasePageContext(_jspx_page_context); } }
从上面的代码的第4行可知,JSP脚本和静态HTML部分都将转换成_jspService()方法里的执行性代码——这就是jsp脚本无须处理异常的原因:因为这些脚本已经存在于try块中,一旦try块捕捉到JSP脚本的异常,并且_jspx_page_context不为null,就会由该对象来处理异常,如上面的代码第12行所示。
_jspx_page_context 对异常的处理也是非常的简单:如果该页面的page指令指定了errorPage属性,将请求foward到errorPage属性指定的页面,否则使用系统指定的页面输出异常信息。
注意:由于只有JSP脚本、输出表达式才会生成_jspx_page_context方法里的代码,所以这两个部分的代码无须处理异常。但是JSP的声明部分依然强制处理checked异常,JSP的异常处理机制对JSP声明不起作用。
在JSP的异常处理机制中,一个异常处理页面可以处理多个JSP页面脚本部分的异常。异常处理页面通过Page指令的errorPage属性确定。
普通页面,该页面抛出错误信息:
<!--通过errorPage属性指定异常处理页面--> <%@ page contentType = "text/html; charset = gb2132" language = "java" errorPage = "error.jsp"%> <!DOCTYPE HTML PUBLIC "-//W3c//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>JSP脚本异常处理机制</title> </head> <body> <% int a = 6; // 抛出异常信息 int c = a/0 %> </body> </html>
异常处理界面(捕获抛出的异常,异常是在异常页面进行处理的):
<!--通过isErrorPage属性指定本页面是异常处理页面--> <%@ page contentType = "text/html; charset = gb2132" language = "java" isErrorPage = "true"%> <!DOCTYPE HTML PUBLIC "-//W3c//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>异常处理页面</title> </head> <body> 异常类型是:<%=exception.getClass()%></br> 异常信息是:<%=exception.getMessage()%></br> </body> </html>
注意:
isErrorPage = "true" 表示该页面是异常页面
Exception对象是用来处理Jsp页面文件在执行时所有发生的错误和异常;Jsp页面文件必须在isErrorPage=true的情况下才可以使用该对象;该对象一般配合Page指令一起使用,通过指定某个页面为错误处理页面,把所有的错误都集中到那个页面进行处理,可以使整个系统的性能得到加强;常用方法如下
// 返回错误信息 getMessage() // 以字符串的形式返回一个对异常的描述 toString() // 以标准错误的形式输出一个错误和错误的堆栈 printStackTrace()