2.6.3 exception对象
2.6.3 exception对象
exception
对象是Throwable
的实例,代表JSP
脚本中产生的错误和异常,是JSP
页面异常机制的一部分。
在JSP
脚本中无须处理异常,即使该异常是checked
异常。事实上,JSP
脚本包含的所有可能出现的异常都可交给错误处理页面处理。
看如图2.21所示的异常处理结构,这是典型的异常捕捉处理块。在JSP
页面中,普通的JSP
脚本只执行第一个部分——代码处理段,而异常处理页面负责第二个部分——异常处理段。在异常处理段中,可以看到有个异常对象,该对象就是内置对象exception
。exception
对象仅在异常处理页面中才有效,通过前面的异常处理结构,读者可以非常清晰地看出这点
_jspService方法中已经有异常处理代码
打开普通JSP
页面所生成的Servlet
类,将可以发现如下代码片段
1 | public void _jspService(final javax.servlet.http.HttpServletRequest request, |
从上面代码的粗体字代码中可以看出,JSP
脚本和静态HTML
部分都将转换成_jspService
方法里的执行性代码这就是JSP
脚本无须处理异常的原因:因为这些脚本已经处于try
块中。一旦try
块捕捉到JSP
脚本的异常,并且_jspx_page_context
不为null
,就会由该对象来处理该异常。_jspx_page_context
对异常的处理也非常简单:如果该页面的page
指令指定了errorPage
属性,则将请求forward
到errorPage
属性指定的页面,否则使用系统页面来输出异常信息。
由于只有JSP
脚本、输出表达式才会对应于_jspService
方法里的代码,所以这两个部分的代码无须处理checked
异常。但JSP
的声明部分依然需要处理checked
异常,JSP
的异常处理机制对JSP
声明不起作用。
在JSP
的异常处理机制中,一个异常处理页面可以处理多个JSP
页面脚本部分的异常。异常处理页面通过page
指令的errorPage
属性确定。
throwEx.jsp
下面的页面再次测试了JSP
脚本的异常机制。
1 | <!-- 通过errorPage属性指定异常处理页面 --> |
以上页面的粗体字代码将抛出一个ArithmeticEception
,则JSP
异常机制将会转发到error.jsp
页面.
error.jsp
error.jsp
页面代码如下。
<%@ page contentType="text/html; charset=UTF-8" language="java" isErrorPage="true" %>异常处理页面 异常类型是:<%=exception.getClass()%>
异常信息是:<%=exception.getMessage()%>
以上页面page
指令的isErrorPage
属性被设为true
,则可以通过exception
对象来访间上一个页面所出现的异常。
测试
在浏览器中请求throwEx.jsp
页面,将看到如图2.22所示的界面
_jspService方法
打开error.jsp
页面生成的Servlet
类,在_jspService()
方法中发现如下代码片段
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request); if (exception != null) { response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } ...... }
从以上代码片段的粗体字代码中可以看出,当JSP
页面page
指令的isErrorPage
为true
时,该页面就会提供exception
内置对象。
在异常处理页面才能访问exception内置对象
应将异常处理页面中page
指令的isErrorPage
属性设置为true
。只有当isErrorPage
属性设置为true
时才可访问exception
内置对象.