JAVA EE项目中,不管是对底层的数据操作,还是业务层的处理过程,还是控制层的处理,都不可避免的会遇到各种可预知的(业务异常主动抛出)、不可预知的异常需要处理。一般dao层、service层的异常都会直接抛出,最后由controller统一进行处理,每个过程都单独处理异常,且要考虑到异常信息和前端的反馈,代码的耦合度高,不统一,后期维护的工作也多。
同时还必须考虑异常模块和日志模块、国际化的支持。
因此需要一种异常处理机制将异常处理解耦出来,这样保证相关处理过程的功能单一,和系统其它模块解耦,也实现了异常信息的统一处理和维护。
接下来以实际工作中Spring MVC实现异常的统一处理为例。
分析
首先看看Spring MVC处理异常的3中方式,进行比较,最终选用一个比较合适的方式。
- Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
- Spring MVC异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
- @ExceptionHandler注解实现异常处理;
简单实践
对于第一种方式来说,使用SimpleMappingExceptionResolver能够准确显示定义的异常处理页面,进行异常处理,具有集成简单、有良好的扩展性,因为是基于配置的对已有的代码没有侵入性等优点。但是该方法仅仅能够获取到异常信息,对于其他数据的情况不适用。配置方法如下:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面,当该异常类型的注册时使用 -->
<property name="defaultErrorView" value="error"></property>
<!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->
<property name="exceptionAttribute" value="ex"></property>
<!-- 定义需要特殊处理的异常,用类名或完全路径名作为key,异常也页名作为值 -->
<property name="exceptionMappings">
<props>
<prop key="cn.basttg.core.exception.BusinessException">error-business</prop>
<prop key="cn.basttg.core.exception.ParameterException">error-parameter</prop>
<!-- 这里还可以继续扩展对不同异常类型的处理 -->
</props>
</property>
</bean>
对于第二种方式,使用实现HandlerExceptionResolver接口的异常处理进行异常处理,具有集成简单、良好的扩展性、对已有代码没有侵入性等优点。同时由于自定义实现,我们