问题描述
我看到很多人在写dao层的程序的时候,在遇到异常时,catch代码块里都是throw new runtimeexception(); 而不是e.printstackprace(); 这样写有什么好处吗
解决方案
1、throw new runtimeexception() 大多数目的是为了让service层的事务回滚 但是这样抛是不好的 因为默认spring回滚RuntimeExceptionhttp://jinnianshilongnian.iteye.com/blog/14423762、spring为DAO层提供了一致的异常体系(DataAccessException) 因此我们应该在DAO层使用类似的异常往上抛 明确告诉service层出什么问题了http://jinnianshilongnian.iteye.com/blog/16859633、再就是异常的设计了 可以参考之前的问题http://www.iteye.com/problems/94208
解决方案二:
异常处理机制是设计中重要的一部分。具体要看项目的需要:是一遇到异常就终止,异常一直抛到最外面呢;还是遇到异常后记日志,然后继续后续的处理,或者启用另外一套逻辑进行处理;还是遇到异常后记日志,进行一些处理,终止流程,然后在页面提示错误信息给用户;等等。然后还要看异常的类型:是可以完全忽略的异常呢;还是在预计可能的范围内可以忽略;还是不能忽略,必须记录日志,并进行专门处理;还是非常严重,必须记录日志,然后终止流程并进行提示。根据以上两种类型区分,异常会在不同的层进行处理,所以如果dao层遇到异常,但是要由service层处理,就会把异常抛出去。而如果异常不经封装就抛给service层,那么service层就头疼了,要应付各种可能的异常类型,所以dao层会把异常重新封装一下,这样service层只要处理统一的异常。
解决方案三:
这里主要是和事物有关,在dao里抛出异常,然后在 service层里进行捕获,因为在service里有多个dao的方法话,一旦有一个发生异常,service里的dao方法都会回滚的,这就保证了数据的一致性抛出异常runtimeexception,RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改。还有就是spring默认的异常,就是一旦发生这样的异常,就会自动捕获的。
解决方案四:
因为e.printstackprace();只是输出异常堆栈信息,而上面的service层无法知道下面出现异常了。throw new RuntimeException是一个unchecked 类型的异常,service层可以捕获到,但是不强制必须捕获。如果对异常不清楚,可以参考下面的资料:http://www.iteye.com/topic/72170http://www.cnblogs.com/focusj/archive/2011/12/26/2301524.html