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有统一的异常处理,封装统一的错误返回

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

  1. Spring事务抛出Exception异常不回滚

    今天有个业务逻辑流程为: 1.访客预约确认先更新预约状态为"预约确认" 2.调用http接口发短信.更新预约状态为"预约成功"等一系列操作 这里面有个问题,如果 ...

  2. 实现一个输入程序,接收从 键盘读入的字符串。当字符串中所含字符个数少于程序设定的上限时,输出这个字符串;否则抛出MyStringException1异常,在异常处理中要求重新输入新的字符串或者中断程序

    实现一个输入程序,接收从 键盘读入的字符串.当字符串中所含字符个数少于程序设定的上限时,输出这个字符串:否则抛出MyStringException1异常,在异常处理中要求重新输入新的字符串或者中断程序 ...

  3. java中在方法体内抛出异常_Java异常处理中___用于方法体内,抛出一个异常对象。...

    Java异常处理中___用于方法体内,抛出一个异常对象. 答: throw; 智慧职教: 运输高致病性动物病原微生物菌(毒)种或者样本的,与内包装要求错误的是 答:E.主容器表面标注"高致病 ...

  4. java抛异常 代替返回_请问业务层方法是抛出一个异常好还是返回一个结果更好...

    @Override public Response checkUserToken(long uid, String accessToken, String deviceToken){ Response ...

  5. java 如何捕获线程中的异常处理_如何捕获Java中另一个线程抛出的异常?

    参见英文答案 > How to catch an Exception from a thread                                    14个 我正在使用一个创建 ...

  6. Spring——DAO层、Spring JDBC、Spring事务控制

    目录 一.Spring对持久层技术支持 1.Spring支持的持久层技术 2.Spring JDBC 2.1. JDBCTemplate类 2.2.Spring JDBC CRUD操作 2.3.Spr ...

  7. SpringBoot中Service层事务控制

    SpringBoot中使用事务比较简单,在Application启动类上添加@EnableTransactionManagement注解,然后在service层的方法上添加@Transactional ...

  8. Spring中的事务控制

    Chapter 1. Spring中的事务控制(Transacion Management with Spring) Table of Contents 1.1. 有关事务(Transaction)的 ...

  9. Spring中的事务控制(Transacion Management with Spring)

    1.1. 有关事务(Transaction)的楔子 1.1.1. 认识事务本身1.1.2. 初识事务家族成员 1.2. 群雄逐鹿下的Java事务管理 1.2.1. Java平台的局部事务支持1.2.2 ...

最新文章

  1. mysql事务四个安全级别_四个MySQL事务隔离级别的详细说明
  2. datagrid如何获取一行数据中的某个字段值_redis 所支持的数据类型以及其应用场景...
  3. Python自学之乐-Python字典实现简单的三级菜单
  4. linux tomcat 日志乱码,Linux下TOMCAT中日志出现中文乱码
  5. 练习作品13:电子试卷自动生成软件
  6. 提高国内访问GitHub速度的9种方案~
  7. 没有理智的欲望会走向毁灭,没有欲望的理智会永守清贫
  8. 【LeetCode】3月31日打卡-Day16-数组排序算法汇总
  9. vue项目:this.function()中关于:this指针失效的问题
  10. @Configuration和@Bean注解详解
  11. Nodejs中puppeteer通过Event抓取HAR数据
  12. select语句一些要点(一)
  13. 每次获取不同的图片按顺序从1-xxx
  14. DirectUI的初步分析-转
  15. 关于UCINET软件使用计算密度的笔记
  16. sysdig_Sysdig: 系统故障排查利器
  17. C语言中free函数如何确定释放的空间大小
  18. js小技巧:根据身份证号,获取身份信息。如性别、生日、年龄
  19. 第二十二届全国青少年信息学奥林匹克联赛初赛
  20. 读书 | 互联网思维到底是什么

热门文章

  1. oracle基本的操作命令,oracle命令基本操作
  2. 操作系统文件分配策略_操作系统中的文件分配方法
  3. Java StreamTokenizer nextToken()方法与示例
  4. linux判断内存并释放,linux 内存清理/释放命令
  5. mysql gtid配置_mysql 5.7 GTID主从配置
  6. 计算机毕业设计谢辞怎么写,毕业论文谢辞怎么写(通用8篇)
  7. java dataset redis,利用Spring-Data-Redis和Jedis操作Redis缓存
  8. 清除缓存 c语言_如何用C语言设置,清除和切换单个位?
  9. 网页如何做到适应在手机上浏览
  10. docker安装nginx并配置SSL到个人博客