为什么 Java 中要使用 Checked Exceptions

来源:互联网 发布:业务元数据 编辑:程序博客网 时间:2024/05/24 03:13
关于 Java 中引入的 Checked Exceptions,目前存在着很多反对意见。正方的观点是引入 Checked Exceptions,可以增加程度的鲁棒性。反方的观点是 Checked Exceptions 很少被开发人员正确使用过,并且降低了程序开发的生产率和代码的执行效率。 
正方代表 James Gosling 
http://www.artima.com/intv/solid.html 
反方代表 Anders Hejlsberg 
http://www.artima.com/intv/csdes.html 
中文版:http://www.csdn.net/develop/article/22/22612.shtm 
两位都是大师级的人物,观点的碰撞非常精彩。 

我个人更倾向于 James Gosling 的观点,即稳定性更加重要。C++ 程序的后期维护成本远远高于 Java 程序,更不要说前期的开发成本了。Java 要担负企业级的核心应用(HA 24X7),没有这些系统级的保证是不可能的。C++、Delphi 都中没有 Checked Exceptions,所以 Anders 设计 C# 时也没有加 Checked Exceptions。当然我并不是说没有 Checked Exceptions 就一定不能写出稳定的程序(你说,我就是比你牛,我用汇编语言都能写出稳定的程序!),但是显然使用 Java 语言写出稳定的程序比用 C++ 更容易。Checked Exceptions 就是编程语言所提供的系统级保证,能否用好是你自己的问题了,并不象 Anders 说的那样严重。我觉得 Anders 大师对于企业级应用并没有太多的概念。James Gosling 看了 C# 的设计后觉得不过如此。当然这只是大师本人的观点,我们未必一定要接受了。


我没有资格评论大师们的观点,但是我知道绝大多数的Java程序员根本就没有领悟“Exception”的真正用处。他们就是把Exception当做异常来理解,没有明白Exception实际上代表了一个UseCase中的异常流的处理。 

在使用UseCase来描述一个场景的时候,有一个主事件流和n个异常流。异常流可能发生在主事件流的过程,而try语句里面实现的是主事件流,而catch里面实现的是异常流,在这里Exception不代表程序出现了异常或者错误,Exception只是面向对象化的业务逻辑控制方法。如果没有明白这一点,那么我认为并没有真正明白应该怎么使用Java来正确的编程。 

而我自己写的程序,会自定义大量的Exception类,所有这些Exception类都不意味着程序出现了异常或者错误,只是代表非主事件流的发生的,用来进行那些分支流程的流程控制的。例如你往权限系统中增加一个用户,应该定义1个异常类,UserExistedException,抛出这个异常不代表你插入动作失败,只说明你碰到一个分支流程,留待后面的catch中来处理这个分支流程。传统的程序员会写一个if else来处理,而一个合格的OOP程序员应该有意识的使用try catch 方式来区分主事件流和n个分支流程的处理,通过try catch,而不是if else来从代码上把不同的事件流隔离开来进行分别的代码撰写。 

总之 Exception <> 异常 

BTW:我是支持BE和JG的观点的。我以前在接触C#的时候,就很奇怪C#的这一点了,Anders有他的理由,但是我认为一个良好的面向对象的软件是应该强制使用Exception的。


http://www.iteye.com/topic/2038


1.小范围检查,就近能解决的,不使用checkException

2.大范围异常流程,使用checkException,跨类,跨dll需要,甚至于跨进程

0 0