传统异常处理方式
Java中的所有异常的根类是Throwable,Throwable类派生Exception和Error。
Error表示Java程序中出现一个非常严重的错误。
对Exception异常处理的过程中,一般通过try catch finally语句,或者使用throws Exception来捕获异常。
但这种方式需要书写大量的catch块,非常烦琐。最大的问题是,异常处理与代码耦合。一旦需要改变异常处理方式,必须修改代码。
Struts2异常机制
Struts2的异常处理哲学
Struts2提供一种声明式的异常处理方式。
Struts2中,Action的execute()方法抛出全部异常。异常交给Struts2框架处理。
public String execute() throws Exception
Struts2框架接收到Action抛出的异常后,将根据struts.xml文件配置的异常映射,转入指定的视图资源。
Struts2异常处理机制源于Struts2拦截器。在struts-default.xml中已经配置了相关的拦截器。
声明异常捕捉
通过在struts.xml中配置异常映射元素<exception-mapping.../>,Struts2便能够处理异常了。无需在Action中编写任何异常处理代码。
异常映射拦截器
Struts2通过拦截器对action抛出的异常进行捕获,这个拦截器是:
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor
在struts2的默认配置文件struts-default.xml中,拦截器ExceptionMappingInterceptor已经配置。配置片段如下:
<package name="struts-default" abstract="true">
………
<interceptor name="exception” class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
………………
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
………………
<default-interceptor-ref name="defaultStack"/>
从struts-default包继承的”子”包中的action都将使用默认的拦截器栈defaultStack(除非action引用了其他的拦截器),而在这个拦截器栈中引用了exception拦截器(是defaultStack栈中第一个引用的拦截器)。因此,在默认情况下,所有的action自然就引用了exception拦截器,而不需要再配置它了。
配置异常映射
使用exception-mapping元素来配置异常映射,将异常类型映射到指定的结果。
exception-mapping元素有二个属性:
exception:指定异常映射所设置的异常类型。即指定一个异常类型的完整类名
result:此属性指定Action出现该异常时,系统转入result属性所指向的结果。
根据<exception-mapping.../>元素出现位置的不同,异常映射分为两种:
局部异常映射: 将<exception-mapping.../>元素作为<action…/>元素的子元素配置。
全局异常映射: 将<exception-mapping.../>元素作为<global-exception-mapping…/>元素的子元素配置。
全局映射对所有Action都有效,但局部异常仅对异常映射所在的Action内有效。
如果局部异常映射和全局异常映射配置了同一类型,在该Action内,局部异常映射会覆盖全局异常映射。
全局异常映射的result属性值通常不要使用局部结果,局部异常映射的result属性值既可以使用全局结果,也可以使用局部结果。
与result映射的查找规则一样,当一个异常发生时,exception拦截器将首先查找抛出异常的action中的局部拦截器映射,然后再查找全局的异常映射。只要找到一个匹配的,那么对应的结果就这被处理。
输出异常信息
ExceptionMappingInterceptor捕获Action处理方法抛出的异常后,除了从异常映射的配置中查找对应的结果名外,还会将下列两个值放到值栈中,以便在结果页面中访问异常信息。
exception:异常对象本身。
exceptionStack:保存异常发生时的栈跟踪信息。
在结果页面中。可以使用struts2的标签来访问异常信息:
<s:property value=”exception”/> 输出异常对象本身。
<s:property value=“exception.message” />取出异常对象的描述信息。
<s:property value=”exceptionStack” /> 输出异常堆栈信息。
例:
此处省去Action与映射结果页面的编写。
<struts>
<package name=”default” extends=”struts-default”>
<global-results>
<result name=”login” type=”redirect”>/login.action</result>
<result name=”sqlException” type=”chain”>/sqlException</result>
<result name=”exception”>/exception.jsp</result>
</global-results >
<!--全局异常映射-->
<global-exception-mappings>
<exception-mapping result=”sqlException” exception=”java.sql.SQLException”></exception-mapping>
<exception-mapping result=”exception” exception=”java.sql.Exception”></exception-mapping>
</global-exception-mappings>
<action name=”dataAccess” class=”com.xxx.DataAccess”>
<!--局部异常映射-->
<exception-mapping result=”login” exception=”com.xxx.XXXException”></exception-mapping>
<result>/dataAccess.jsp</result>
</action>
</package>
</struts >