关于在应用程序中如何设计合理的异常体系,在《深入浅出Hibernate》这本书中有一大段详细的论述,另外一些JAVA界的高人也先后发表过专门的文章来讨论这个问题,书中也给出的文章的链接。
其实,通过Hibernate和Spring中对异常处理的态度,就可以看出一些好的设计原则。在Hibernate2的时候,调用Hibernate的API时必须处理一个CheckedException,这和使用JDBC时是一样的,Hibernate的作者在后来的一封Email中也承认多少是受了JDBC的影响。但是面对这种底层的异常,我们能做些什么呢?继续抛上去或者捕获后什么都不做。这样的做法只能使程序中充满了重复的没有太大意义的try...catch...代码,而其功能和一个UncheckedException没用太大差别。所以Spring包装了Hibernate后抛出了一个UnckeckedException。后来Hibernate也意识到抛出一个UncheckedException是一种更合适的做法,所以在Hibernate3中不再抛出CheckedException了。
今天又看到了一个Spring的特性,更加说明了Spring在异常处理方面的思路和态度:
默认的情况下,spring只有当unchecked exception被抛出时,才rollback事务。
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED,- MyCheckedException,+MyUnCheckedException</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
-MyCheckedException 指定如果方法抛出MyCheckedException或它的子类,事务将 会自动回滚。
+MyUnCheckedException 指定如果方法抛出MyUnCheckedException或它的子类,事务仍将会提交。
可我们的项目中是怎么做的呢?
几乎在每一层的每一个方法中都try...catch一下,然后在catch代码块中抛出一个OAException,这个OAException是New出来的而且还是一个CheckedException,包含了一句简单的异常信息,如“数据访问出现错误……”。这样做的后果有两个,一是又回到了Hibernate2的那种异常处理方式,使代码变的复杂了,有时候只有一两行的代码就可以搞定的现在要写个十多行的异常处理代码。二是丢掉了原始的异常信息,这一点就更严重了,由于OAException是New出来的,所以只包含了简单的提示信息,而真正出现异常的原始信息却丢掉了。另外,从上面Spring事务的回滚机制来看,如果采用默认配置,事务都会变的形同虚设了。
这种异常处理体系对程序员是一种痛苦,对程序设计来说是一种缺憾!
分享到:
相关推荐
spring-hibernate.jar
spring与hibernate的整合 spring事务的配置
这是对spring_hibernate_struts2的理解,可以在面试中简要的抓住重点进行陈述。
spring整合hibernate实现事务处理 1.spring整合hibernate实现事务处理-注解方式 2.spring整合hibernate实现事务处理-XML方式
以上是springmvc+spring+hibernate整合基于eclipse,oracle开发
spring mvc + spring + hibernate 全注解整合开发视频教程 11
spring 2.5 -3.0以及hibernate3.0的jar包包括annotations
Spring与hibernate 整合 简单示例 Spring与hibernate 整合 简单示例
gwt+spring+hibernate整合例子,导入myeclipse中(要安gwt插件)即可用,数据库自己去代码中查看。包是精简版的,去掉很多不必要的包
spring mvc + spring + hibernate 全注解整合开发视频教程 12
Spring+hibernate整合源代码 结束Sping+hibernate 的使用方法 包括演示示例
struts2和spring和Hibernate的整合包,在MyEclipse中自动导入老是有冲突包。
这是搭建SSH框架所需的Struts2,Spring,Hibernate相关完整jar包,亲测可用。
基于SpringMVC以及Spring,Hibernate的非注解入门小demo
spring mvc + spring + hibernate 全注解整合开发视频教程 04
整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...
struts,spring,hibernate是什么.txtstruts,spring,hibernate是什么.txtstruts,spring,hibernate是什么.txtstruts,spring,hibernate是什么.txtstruts,spring,hibernate是什么.txtstruts,spring,hibernate是什么....
spring_hibernate整合实例 spring_hibernate整合实例
spring 与hibernate的集成方法 spring 与hibernate的集成方法
spring mvc + spring + hibernate 全注解整合开发视频教程 06.haozip03