当前位置: 代码迷 >> J2SE >> 求解:错误处理的规则有关问题
  详细解决方案

求解:错误处理的规则有关问题

热度:114   发布时间:2016-04-23 19:50:55.0
求解:异常处理的规则问题
对于异常处理上面,个人产生了很大的疑惑或者叫不确定。
比如一个持久层类的方法,访问数据库产生了异常,这个时候我有两种选择:
1.继续使用异常(抛出该异常)通知上层/调用者出现了错误
2.完全处理掉该异常(或者可以记录一些日志什么的),然后通过返回值体现成功与否(比如boolean返回值:异常就返回false,对象返回类型:异常就返回null)

请问这两种处理方式哪种好?为什么
------解决思路----------------------
不管是抛出还是不抛出, 首先, 这个问题在当时都发生了. 服务器在没有修改的情况下, 是不会自己解决这个bug的.
所以, 将异常抛出, 还是将它捕获, 然后抛给外面一个false或者null 得看业务逻辑.
比如说.. 有用户登录, 查询数据的时候出错了, 如果你把错误抛出去, 那么上层逻辑会卡在那里, 或者显示给用户一个异常错误.或者上层自己捕获到这个异常之后, 会有自己的处理.
但如果你抛出的是null 或者false.. 上层逻辑如果认为这个人没注册, 又让他去注册了, 那是不是问题就更严重了呢... 因为你自己把异常捕获了, 那么就要去跟上层去约定, 你自己返回的null和false到底表示的是什么意思... 
所以我是比较建议抛出异常, 然后上层根据异常来处理.. 而不是额外的再判断什么约定, 因为异常往往比你想象的种类要多.. 而底层处理异常和上层逻辑处理异常导致的结果可能是完全不一样的.. 所以我觉得应该让上层逻辑来判断具体应该怎么处理...
------解决思路----------------------
引用:
Quote: 引用:

当然.... 最简单的约定就是.. 你抛出错误提示.. 让上层逻辑直接提示给玩家...   这样只需要有一个约定的规则就行了...

我现在想到了三种方式:
1.层层捕获异常,封装自己的异常类并抛出、记录日志
2.持久层抛出各种异常后,业务层捕获后都只封装同一种类型的异常抛出给表示层
3.业务层捕获持久层的所有异常,不抛出异常,而是通过返回值告诉表示层是否出错(null,false,空数组等)

第一种感觉最麻烦,小项目完全没必要,第二种在表示层势必还是得try...catch一次,稍微麻烦点
而第三种,对于表示层来说,他不需要太多的提示,只需要结果正确与否,简单的提示给用户即可

恩... 思路确实就这些了... 剩下的就是看具体的项目和开发者了..... 其实问题都不大...