为什么C#中不包含Java“throws”子句(在方法声明中)?

时间:2008-12-22 10:06:27

标签: c# java exception programming-languages

为什么C#中包含Java“throws”子句(在方法声明中)?

5 个答案:

答案 0 :(得分:31)

Anders Hejlsberg(首席C#架构师)在本次采访中解释道:

http://www.artima.com/intv/handcuffs.html

答案 1 :(得分:23)

(除了Patrik有点明确的答案。)

Java中的已检查异常是一个非常有争议的问题。我曾经爱过他们,在编写C#时非常想念他们。感觉就像我在没有安全带的情况下开车一样。现在,他们惹恼了我......因为虽然他们在理论上听起来是个好主意,但他们确实 肯定给我带来了很多悲伤,但没有提供太多实实在在的好处。我不记得曾经遇到C#代码中的错误,检查异常会让我免于死。这并不是说它不会发生,但它并没有发生在我身上。

令人烦恼的是,在某些方面它仍然感觉C#太松懈 - 但Java的方法并不是正确的。这就像有一个更好的解决方案等待被发现,Java的尝试是一个很好的实验,但它并没有完全奏效。

答案 2 :(得分:4)

我认为检查异常作为一种语言特性,暴露了微软和Sun之间的一些文化差异。

在大多数情况下,Microsoft是一家客户公司。他们制作的大部分软件以及他们的开发堆栈的目标是客户端软件。

是的,是的,我知道微软会生产服务器软件。但是,Office和Windows在收入方面比Windows Server和Exchange更重要。

我认为可以说大多数用.NET编写的软件(用VB 6编写的软件)都是客户端软件。当然,其中很大一部分是Web Software,它运行在Web服务器上,但其中大部分都是......“客户端类型的Web应用程序”。我会说大多数网络应用更像是“Word”,然后就像Exchange一样。

是的,我知道有WCF和SOAP服务以及类似的东西,但这些通常只是“客户端”类型的“中间件”。

另一方面,Sun主要是一家服务器公司。他们的软件在用户界面方面并不是最好的(这在Unix上并不轻微......只是Solaris .. Mac OS X基于unix而且它有一个非凡的用户界面,两者之间的区别太阳真的不像苹果那样关心UI。他们甚至出售了THIN CLIENTS,它们试图将所有东西都推到服务器上。

所以......无论如何......微软主要是一家客户公司,而Sun主要是一家服务器公司。

编写服务器软件时,可靠性是一件大事。很大。如果电子邮件服务器崩溃,人们就不会收到电子邮件,业务也会停止。因此,确保服务器能够智能地处理可能发生的大多数错误是销售电子邮件服务器的重要部分。

使用客户端软件。可靠性很重要,但与服务器软件相比,AS的重要性并不重要。只要大多数主线方案都有效,人们就会感到高兴。在许多情况下,疯狂的边缘场景可以被忽略或一般地处理。

超级可靠的一个关键是确保处理可能发生的所有边缘情况。如果我们无法打开数据库文件,因为它被另一个进程锁定,或者我们没有读取它的权限,会发生什么?如果我们的内存或磁盘空间不足会怎么样?如果在运行此程序时电源耗尽会发生什么?

对于非常高的可靠性要求,检查异常可能会有所帮助。 如果有一个你没想到的场景,并且你的业务对你预期的一切都很重要,那么让编译器告诉你......“嘿,你没有处理RocketFuelExhaustedException”会有所帮助。

因此,我认为已检查的异常源于Sun作为服务器供应商的观点。

对于Microsoft来说,作为向客户端软件开发人员销售开发人员工具的客户公司,检查异常当然是非常恼人的事情,只会阻碍实际工作的完成。

那是我的0.02美元反正......

答案 3 :(得分:3)

主要原因是C#设计者决定不使用“已检查的例外”。这意味着开发人员不必在try-catch块中包含异常抛出子句。据认为,这仅对小规模应用有用,对大型项目没有实际好处。另外,经过检查的异常实际上被开发人员滥用,他们经常使用空的catch块。由于没有经过检查的异常,因此没有理由声明方法,可以抛出哪些异常。

使用或不使用“已检查的例外”是一个有争议的话题,但大多数人似乎都同意不需要它们。 Spring是Java中的一个重要框架,它将已检查的异常转换为运行时异常。

答案 4 :(得分:0)

例外显然是'特殊'事件。在.net的范例中,异常永远不会发生(这就是为什么你有像TryParse,......这样的方法),因此强制处理不应该发生的事件是没有意义的。