也议Java与C#的异常处理实现

2007年1月30日 | Author: zhangdi | 标签: , , , , ,

刚看到tangrui同学的一篇文章,说Java与C#在异常处理上的区别。以前我们还是同事的时候,就一起讨论过这个问题,当时,我是极力的不满意C#的处理方式。这次看到这篇文章,有些给C#正名的意图,所以不得不说一说了。

首先还是声明一下,我不是大师,而设计Java与C#的都是大师,所以我并没有班门弄斧的意思,只是表达一下自己的观点和情感罢了。

对于Java和C#异常处理的区别,核心问题就是已知自定义类型的Exception是否应该在编译期检查。Java是强制检查,所有的接口定义都要声明自己要抛出哪些Exception,没有声明的绝对不能抛出(除RuntimeException外);C#是完全没有检查,任意接口都可以抛出任意类型的Exception。

通俗起见,我来举个例子:一把手枪,它有一个保险装置,在没有打开保险之前,扳机是不起作用的,当然,只要正确的将保险装置打开,就可以指哪打哪了;还有一把手枪,没有保险装置,但有一份很详细的说明书,告诉你这个东西有危险,有可能走火,小心点儿,以及如何正确使用并且避免走火,另外,作为附加,还给了你一块几平方分米防弹材料,建议你把它们放在走火的时候有可能打到的地方。那么,如果你是最终用户,你会选择哪把手枪呢?(需要说明的是,为了对比,我故意没有说,第一把手枪也有非常充分的说明书,但是很显然,不需要那不够用的防弹材料)

我觉得,Java就像是第一把手枪,C#像第二把手枪。

再从技术方面来说,几个问题:
1. 在设计一个接口的时候,是不是需要同时告诉用户,这个接口有可能抛出什么类型的Exception?
2. 如果需要,那么这个Exception类型是否应该成为一个接口声明的一部分?
3. 一个已知的有可能发生的exception被操作系统捕获是否可以说是用户在处理这个接口的声明的时候,出现了疏忽呢?
4. strong-type的目标是在编译器发现尽可能多的关于类型的错误,如果我们把接口的定义看作类型的一部分,那么是否可以说,这个有可能将checked exception暴露给操作系统的编译器在strong-type上有缺陷呢?

我的回答都是true。所以我觉得C#在strong-type上作的不够好。让用户不得不靠自己的记忆力以及本来就不太靠得住的细心来对付这些潜在的异常。

另外,我还有一个怀疑,就是C#是为了继承C++的异常处理方式,所以才放弃了Java的异常处理方式的。(只是怀疑,大家都知道,C++并不是strong type语言)

我对于编程语言并没有特别的偏好(也不允许有偏好,吃不饱的时候,就不挑食了),所以这里说的意思,只是说我觉得C#对于我这种懒得去背诵API的人来说,用起来不是很顺畅。

  1. 2007年1月30日11:04

    我在这里回答了你的那几个问题。
    不过我要加上一句,Java 那把手枪开启这个安全装置过于复杂……

  2. 2007年1月30日11:06

    原来 WordPress 可以自己把相关的帖子添加成评论呀,强悍,浪费了……