controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常

x33g5p2x  于2022-01-04 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(412)

controller的异常处理以及service层的事务控制

最近写代码涉及到一些事务,上午终于把代码给理顺了,之前不太清楚在哪里做异常处理,导致代码遍地try-catch,相当难看。

还是基于controller-service-dao三层来写代码,从入口开始,controller层的方法对应的是某个url,面向的是应用人员,应该返回他们能读懂的信息,所以controller必须做异常处理,一般来说会有统一的异常处理方法;

service层面向的是controller,service层中的某些方法,必须保证其事务,所以在service层进行事务控制是相当必要的,对于多条sql进行事务控制,如果某个sql执行失败,那么应当对已经执行的sql语句进行回滚;

dao层更多是单一的sql语句,没有必要进行事务控制,因为事务开销并不便宜(官方原话);

基于以上三点,回头再思考关于异常的处理,一般情况应该把异常网上抛,一直抛到最终处理的那一层,所以对于dao层和service其实是没有必要进行try-catch的,直接往上抛异常就可以。

与之对应的,是spring的事务配置,默认情况下,spring只对运行时异常进行回滚,如果在dao层处理了异常,那么需要进行额外的配置,spring才会对异常进行回滚,常用的配置是@Transactional(rollbackFor=Exception.class)

顺便提一个java知识点,关于try-catch-finally中,finally的作用,finally设计之初就是为了关闭资源,如果在finally中使用return语句,会覆盖try或者catch的返回值,最常见的就是覆盖异常,即便catch往上抛了异常,也会被覆盖,返回finally中return语句的返回值。
service事务抛错回滚后,controller在调用该service处会抛出异常吗?在controller做了异常的处理的情况下,该异常会到controller来么?
因为controller层调用了service层的业务逻辑,因此service出错controller必将联动报错。
service将异常抛给controller层,controller做异常捕捉并能够进行处理。

controller层 trycatch不影响service层抛出的异常

1.controller层 trycatch不影响service层抛出的异常 因为 service层利用spring
的aop控制异常, 而controller层 try catch 不影响, aop完成之后,才会到controller层,所以不影响,但如果在service try catch 一定要抛出异常 否则 不回滚, @Transactional(rollbackFor = Exception.class) 加这个 不仅仅是RuntimeException

一般Service层怎么向Controller层传递业务处理结果呢?

有个疑问想问问大家,就是关于Java三层框架层之间返回业务结果如何处理比较好,以及异常一般怎么处理

比如,
我service层处理逻辑,有四种情况,这种时候我该怎么给controller层返回处理结果?

还有就是.如果我service层发生了异常,比如数据库异常啦,文件读写异常这些,我应该直接在service层catch处理,还是直接抛出到controller层再catch…

我之前也写过一个在service层catch异常,然后封装为自定义异常再抛出到controller的.但是这样处理程序逻辑感觉也不是特别好…
第一个问题,如何返回多种情况传递给controller,这个不是很简单吗,方法是有返回值的啊,主要是你返回值的数据结构是否合适,你可以用枚举,可以用map,可以是集合,可以自己封装dto(data transfer object)
第二个问题,如何处理异常呢,最好不要在service层进行try catch,因为现在基本上都是在service层作业务处理,事务会配置在这一层,try catch会导致事务无法回滚,当然你也可以try catch,但是一定要抛出runTimeException才可以回滚事务。最好的做法是在controller层使用aop进行try catch统一管理

一个关于service层抛异常,controller处理的问题

往数据库插入数据,由于service抛异常,虽然事务回滚了,但是程序已经不能在执行下去了,那么我在controller的处理没了用处,页面正等着controller的返回结果呢,也没了。难道要我在controller手动 try…cathch吗?那也太麻烦了。
我说得清楚点:controller等着service的返回结果封装返回结果集,页面等着对结果集处理,然后进行下一步操作。现在service崩了,一条线都崩了。难道只能在controller手动try…catch,然后在catch里封装另一个返回结果集吗?
spring有统一的异常处理,封装统一的错误返回

相关文章