Dao层(hibernate实现)的异常是在Dao层类内处理还是抛到上一层(Service业务层)

Dao层(hibernate实现)的异常是在Dao层类内处理还是抛到上一层(Service业务层)

如果抛出的话是抛出运行时异常还是非运行时异常

我知道怎么写都行,但我想更贴近实际开发中的情况,请有经验的朋友指点一下
问题补充:
谢谢大家
不过还有一点我很想弄明白,就是Dao的异常是不是throws给Service,那Service层的异常是直接在方法内用try...catch处理还是再throws给Action呢
问题补充:
嗯,大概有数了,我在事务控制上是用Spring声明式事务统一管理的。
现在的异常是Dao层的,比如hibernateTemplate里各种方法抛出的DataAccessException,我自定义了一个异常继承自Exception,然后DAO层的接口方法throws这个自定义的异常
问题补充:
可是不是应该抛出非运行时异常比较好吗

Exception:表示可恢复的例外,这是可捕捉到的。

Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

    但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。

    出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。

    如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。



没什么好不好的,checked exception一般是程序中出的错,因此总是要抛出,并被处理的。而runtime exception在上面说过,通常由JVM接管的,spring就认为这个异常很严重,非要处理,所以要回滚。而其它的异常一般不主动回滚,由程序员来决定。当然,偷懒的作法就是直接抛出runtime exception,那spring就得处理了。
其实常见异常spring都处理好了.

一般都是抛出非运行时异常,


lovewhzlq (CTO) 2009-10-19
由于Spring中一般配置都是对运行时异常进行回滚,非运行时异常不回滚, 如果有回滚操作时,偶一般将应用的异常继承为运行时异常(怕麻烦),不然就继承非运行时异常,再在spring中配置为异常发生时回滚。
当然如果没有回滚需求的话,那就抛出checked exception好了,(hibernate就这样干的,逻辑性好)
蔡华江 (架构师) 2009-10-19
Service层的异常当然是不能自己处理,因为service层是业务逻辑层,不是应用层,不应该处理掉异常,应该由应用层也就是action部分来处理

throws给Action处理
lovewhzlq (CTO) 2009-10-19
当然可以try..catch..进行处理,这就随程序员的心情了
不过在spring中是可以对service的事务和异常进行统一处理的,就在前面提过,默认情况下,如果spring发现service抛出runtime exception,就回将回滚事务。
当然如果没什么事务控制的情况下,就是继续往上抛了,看action能不有处理,
如果action不能处理,就会输出日志,而页面就会出现找不到页面错误了
蔡华江 (架构师) 2009-10-19
没这必要,DataAccessException就是spring封装的一个RuntimeException,直接抛出就行了
蔡华江 (架构师) 2009-10-19
一般都是抛出非运行时异常的,
lovewhzlq (CTO) 2009-10-19
最好是一层一层往外抛,到了Action层,自己就写一个异常处理类,处理掉这个异常,并以友好的页面,呈现给前台,让访问者知道发了什么事。
sunlightcs (架构师) 2009-10-21

你可能感兴趣的:(DAO,spring,多线程,Hibernate,配置管理)