论坛首页 Java企业应用论坛

我对Checked Exception观点的变化

浏览 4924 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-01-25  
为什么 Java 中要使用 Checked Exceptions的讨论经历了一年多的时间。随着时间的推移,我的观点也发生了一些变化,不知道dlee和Robin现在怎么样。在新项目的起步阶段,我们公司也在进行关于异常设计的激烈讨论,今天我就先说一说我的看法吧!

Checked Exception的设计存在一个矛盾,就是方法声明抛出的异常是从方法自身的设计出发的,我说抛几个异常就抛几个,根本不管调用者能不能处理、怎么处理,尤其是对于系统底层的方法更是这样。其实这也很正常,方法不应该依赖于调用者,依赖的方向应该是反过来才对。但是这样一来,调用者就经常会对要捕捉的异常感到迷惑,尤其是对那些设计不太合理的接口。
《Effective Java》 写道
对不可恢复的情况使用Unchecked Exception
从这句话看,也存在上面讲的矛盾,方法往往不知道调用者能否从错误中恢复,只有调用者才知道,说不定有的调用者能恢复,有的调用者不能恢复也不一定。那么好,这句话能不能改成:“只要调用者可能恢复不了,就用RuntimeException,否则,即只有我肯定调用者一定能恢复,才使用Checked Exception”,这句话很绕嘴,但是这大概就会成为不使用Checked Exceotion的理由,因为谁也不能肯定调用者一定能从错误中恢复。

但是,滥用Unchecked Exception比起滥用Checked Exception更可怕,对于懒惰、不负责任的程序员,调用抛出CheckedException方法的时候,最坏的情况也是依照编码规范捕捉异常、写日志、抛出新的异常(即使是这样几乎也是Copy-Paste的结果,如果这个都懒得做……),至少他看到了异常的处理,多少也会去想想吧,但是对于抛RuntimeException的方法,懒人理都不会理,反正不会出错。

如果大家都能恰当的定义异常,理智的捕捉异常,Unchecked Exception还是会比Checked Exception好一些。否则,如果异常设计不合理,语义表达不清,捕捉这边的人脑子也不清醒,无论是Unchecked Exception还是Checked Exception,都会存在各自不同的问题。
   发表时间:2005-01-25  
那个帖子不是已经讨论的很清楚了吗?在我做的应用中,如果有需要,我会定义一些CheckedException,这完全是根据业务需要来做出来的。
0 请登录后投票
   发表时间:2005-01-25  
呵呵!不好意思啊。长帖子太容易把闪光的东西淹没了(这就是论坛的弱点,Robbin开个Wiki吧),我把你的帖子粘贴过来,你不介意吧?
robbin 写道
使用Checked Exception还是UnChecked Exception的原则,我的看法是根据需求而定。

如果你希望强制你的类调用者来处理异常,那么就用Checked Exception;
如果你不希望强制你的类调用者来处理异常,就用UnChecked。

那么究竟强制还是不强制,权衡的依据在于从业务系统的逻辑规则来考虑,如果业务规则定义了调用者应该处理,那么就必须Checked,如果业务规则没有定义,就应该用UnChecked。

还是拿那个用户登陆的例子来说,可能产生的异常有:

IOException (例如读取配置文件找不到)
SQLException (例如连接数据库错误)
ClassNotFoundException(找不到数据库驱动类)

NoSuchUserException
PasswordNotMatchException

以上3个异常是和业务逻辑无关的系统容错异常,所以应该转换为RuntimeException,不强制类调用者来处理;而下面两个异常是和业务逻辑相关的流程,从业务实现的角度来说,类调用者必须处理,所以要Checked,强迫调用者去处理。

在这里将用户验证和密码验证转化为方法返回值是一个非常糟糕的设计,不但不能够有效的标示业务逻辑的各种流程,而且失去了强制类调用者去处理的安全保障。

至于类调用者catch到NoSuchUserException和PasswordNotMatchException怎么处理,也要根据他自己具体的业务逻辑了。或者他有能力也应该处理,就自己处理掉了;或者他不关心这个异常,也不希望上面的类调用者关心,就转化为RuntimeException;或者他希望上面的类调用者处理,而不是自己处理,就转化为本层的异常继续往上抛出来。

说的很好!最后一段讲的也不错,只是举的例子好像不太能印证你的观点。
0 请登录后投票
   发表时间:2005-01-25  
难道很多人都没看过expert one-on-one J2EE吗?(赫赫,当初偶也是没看过,所以一阵迷茫)
里面说的非常清楚,详情请看chapter 4
0 请登录后投票
   发表时间:2005-01-25  
当年看Expert-One-on-One的时候也是一头雾水,还是后来自己明白过来了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics