首页新闻找找看学习计划

java异常从业务层集中抛出,是不是每个控制层方法都要try catch

0
悬赏园豆:10 [待解决问题]
java开发三层结构中,业务层的方法有许多判断,异常都从业务层集中抛出,比方程序非空判断或格式判断等编程类错误以及业务异常抛出,那是不是每个上层action都要try catch 在catch中获取异常信息给前台?
我的做法是这样的 ajax中,service层会有许多异常可能抛出,在每个action中都try catch,在catch里写out,println(e.getMessage());,这样对吗? 你们都怎么做的?
離遠離幻的主页 離遠離幻 | 初学一级 | 园豆:192
提问于:2015-11-28 17:09
< >
分享
所有回答(4)
0

在action的方法上加 throws xxException?这样就不用try catch了,除非你有一个必要的Exception需要在catch里面处理

之奇一昂 | 园豆:1421 (小虾三级) | 2015-11-28 18:08

抛出的异常哪里处理呢?  我是需要返回前台异常的信息的

支持(0) 反对(0) 離遠離幻 | 园豆:192 (初学一级) | 2015-11-28 18:16

@離遠離幻: 服务器的出错信息要返回给前台吗?为什么要这样做?

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-11-28 19:38

@之奇一昂: 请看一下我的提问内容,是说业务层有许多错误需要通知控制层,只有向上抛出异常,然后需要把异常的信息返回给前台,比方throw new BizException("注册名已存在"),在业务层抛出,在控制层try catch,然后在catch里out.write(e.getMessage());返回给前台,但是我觉得这样每个action都要try catch,这样的编程方式对不对?

支持(0) 反对(0) 離遠離幻 | 园豆:192 (初学一级) | 2015-11-30 16:28

@離遠離幻: “注册名已存在”这样的信息为什么要通过Exception来传递呢?不太建议这样的编程方式……没这样试过,所以也没啥好的建议。try catch吧

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-11-30 19:43

@之奇一昂: http://blog.csdn.net/ajun_studio/article/details/6876109 参考一下这个吧

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-11-30 19:46

@之奇一昂: 我的一个方案也是写一个ExceptionHandler全局控制。我请问一下 你们从业务层发生错误后如何通知上层控制层?

支持(0) 反对(0) 離遠離幻 | 园豆:192 (初学一级) | 2015-11-30 20:08

@離遠離幻: Exception。。。

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-11-30 21:58

@之奇一昂: 是了,那抛出的exception又怎么处理呢,也只能用try catch呀

支持(0) 反对(0) 離遠離幻 | 园豆:192 (初学一级) | 2015-12-02 21:04

@離遠離幻: 嗯,没那么多需要抛的,没在这方面担心过

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-12-02 21:07
0

当然不是。我的处理方法是只在明确知道可能会有异常发生,并且需要处理,并且知道怎么处理的时候,才去try异常并进行处理。

吴瑞祥 | 园豆:28729 (高人七级) | 2015-11-30 09:50

我就是想问一下 业务层有许多错误需要通知控制层,只有向上抛出异常,然后需要把异常的信息返回给前台,比方throw new BizException("注册名已存在"),在业务层抛出,在控制层try catch,然后在catch里out.write(e.getMessage());返回给前台,但是我觉得这样每个类似的action都要try catch,这样的编程方式对不对?

支持(0) 反对(0) 離遠離幻 | 园豆:192 (初学一级) | 2015-11-30 16:29

@離遠離幻: 这种方法当然不对。编程课刚开始给你讲异常处理的时候就说了。能用判断的处理的不要用异常处理,和判断比起来异常过多会让整个系统变得不稳定。有一个概念是CQRS可以去看看对这个问题会有帮助

支持(0) 反对(0) 吴瑞祥 | 园豆:28729 (高人七级) | 2015-11-30 17:06

@吴瑞祥: 但是在3层结构中,业务层有很多可能发生的业务错误,需要通知上一层控制层,不抛异常怎么通知呢?

支持(0) 反对(0) 離遠離幻 | 园豆:192 (初学一级) | 2015-11-30 18:12

@離遠離幻:  所以我说了有一个CQRS的概念你去看下,

简单来说就是将所有方法分为2类,操作方法和查询方法。查询方法返回结果集。操作方法返回操作结果。

一般系统里都会定义一个操作结果实体类,包含  是否成功,提示消息,错误码。

这样就够明白了应该。

支持(0) 反对(0) 吴瑞祥 | 园豆:28729 (高人七级) | 2015-12-01 09:57

@吴瑞祥: 我知道您的意思,把错误信息封装成对象返回,这是正常流程,但是查询方法也不代表不会抛出异常啊,比方一个查询方法在业务层,有可能当前用户没有权限执行这个查询方法,那也要通知上层控制层说没有权限查询,要把这个消息给上层,也只有抛Exeption呀

支持(0) 反对(0) 離遠離幻 | 园豆:192 (初学一级) | 2015-12-02 21:06

@離遠離幻: 查询方法的权限验证本身就是有问题.你完全可以在上层实现权限验证.

然后在对外接口的一次,所有的返回值类型都继承自操作结果类,你可以看下微信的api设计.他不管是操作还是查询,所有的返回值都包含操作结果,和异常信息.

支持(0) 反对(0) 吴瑞祥 | 园豆:28729 (高人七级) | 2015-12-08 13:29
0

这儿异常的处理需要根据你的具体情况分析

如果你的程序只是想让异常不抛出 不要让外部知道 那么统一提示程序错误就好了

如果你的程序想让用户按照异常的信息 进行操作 那么需要根据errormesserage 来弹出 

 

至于捕获的地方 在顶级应用程序捕获就好了 一般都会有一个全局的error事件

在里面捕获异常即可 

 

要注意的地方有 抛出异常的位置 需要指定异常的类型

例如 exceptionlog 这种异常 只是记录日志

exceptionStop 这种异常 中断程序 

不然捕获异常的位置 无法根据不同的异常进行不同的处理

小眼睛老鼠 | 园豆:2774 (老鸟四级) | 2015-11-30 13:14

全局捕获可以吗?写一个ExceptionHandler?我只是想问一下在每个需要提示的action里都try catch捕获我已知在业务层抛出的异常,这种方式对吗?有什么改进的方法,我想到一个:可以写一个ExceptionHandler,然后捕获action向上抛的异常,然后判断X-Requested-With头是否是XMLHttpRequest,是的话就写指定业务异常信息到输出流。这样可行吗?

支持(0) 反对(0) 離遠離幻 | 园豆:192 (初学一级) | 2015-11-30 16:41

@離遠離幻: FilterAttribute, IExceptionFilter

支持(0) 反对(0) 小眼睛老鼠 | 园豆:2774 (老鸟四级) | 2015-11-30 16:45

@離遠離幻:业务层的异常一定都要抛出给外面么,有些运行时异常完全可以不用捕获吧。还有如果action的异常处理逻辑基本一致,试试加下aop

支持(0) 反对(0) luffing | 园豆:200 (初学一级) | 2016-01-11 18:51
0

既然service层发生异常。直接在service层抛出。没必要往action抛了。就近处理

浮生若云 | 园豆:268 (菜鸟二级) | 2015-12-21 18:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册