天天看点

checked and unchecked exception

checked 和 unchecked exception 的区别,资深一点的Java程序员都知道。这里我感兴趣的是该怎么用checked 和 unchecked exception.

最早的exception处理机制来自C++,在C中为了避免错误,我们会根据返回结果或者判断状态(文件操作)来保证程序的正确性。这样在代码中就会有大量的if/else判断最后甚至让读代码的人忘了程序片段的真正意图。因此C++中引入了exception的处理机制。不过C++为了兼容C,异常处理是选择性的。Java是真正严格实现异常机制的语言。

从架构的角度什么时候用checked exception,什么时候用unchecked exception, 如何封装,处理,仁者见仁,智者见智。有种选择是不用checked exception. Think In Java作者Bruce Eckel在http://www.mindview.net/Etc/Discussions/CheckedExceptions 提到这种设计选择。我的理解是原因有三点:1)业务逻辑不愿意恢复的错误,比如Rod Johnson在J2EE Deveopment Without EJB中举了一个Service Locator 中JNDI Lookup failure时直接抛出Un-Checked exception。这样不会逼着系统处理这种异常,比如尝试恢复或者提示用户。2) checked exception是编译时异常,强制要求处理,确实降低了程序出错的可能。但有时程序中还是大量充斥这种异常处理的代码。 3)程序员经常有意无意中丢掉了异常(简单的打印出异常信息,没有思考如何进一步处理),这是程序中引入bug的一种主要来源,并且比较难找。

据说Spring中DAO的封装中都是Runtime Exception. 不知是不是也是基于此考虑。