为什么没有';t爪哇;抛出;C#中包含的条款(在方法声明中)?

为什么没有';t爪哇;抛出;C#中包含的条款(在方法声明中)?,c#,java,exception,programming-languages,C#,Java,Exception,Programming Languages,为什么Java“throws”子句(在方法声明中)没有包含在C#?Anders Hejlsberg(首席C#架构师)在这次采访中解释道: (除了Patrik有点确定的答案之外。) Java中的检查异常是一个非常有争议的问题。我过去很喜欢它们,在写C#的时候也很想念它们。感觉就像我没有系安全带一样。现在,他们让我恼火。。。因为虽然从理论上讲它们听起来是个好主意,但它们确实给我带来了很多悲伤,但却没有带来多少实际的好处。我不记得曾经在C代码中遇到过一个bug,如果检查异常,我就可以避免它了。这并不是

为什么Java“throws”子句(在方法声明中)没有包含在C#?Anders Hejlsberg(首席C#架构师)在这次采访中解释道:

(除了Patrik有点确定的答案之外。)

Java中的检查异常是一个非常有争议的问题。我过去很喜欢它们,在写C#的时候也很想念它们。感觉就像我没有系安全带一样。现在,他们让我恼火。。。因为虽然从理论上讲它们听起来是个好主意,但它们确实给我带来了很多悲伤,但却没有带来多少实际的好处。我不记得曾经在C代码中遇到过一个bug,如果检查异常,我就可以避免它了。这并不是说它不可能发生,但它没有发生在我身上

令人恼火的是,在某些方面,它仍然感觉C#过于宽松——但Java的方法并不完全正确。这就好像还有更好的解决方案有待发现,而Java的尝试是一个很好的实验,但没有完全奏效。

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


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

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

在很大程度上,微软是一家客户公司。他们制造的大多数软件,以及他们的开发堆栈的目标,都是客户机软件

是的,是的,我知道微软生产服务器软件。然而,就收入而言,Office和Windows要比Windows Server和Exchange大得多

我认为可以公平地说,大多数用.NET编写的软件(VB6更是如此)都是客户端软件。当然,其中很大一部分是在Web服务器上运行的Web软件,但大部分都是真的。。。“客户端类型的web应用程序”。我想说,大多数网络应用程序更像是“Word”,而不是Exchange

是的,我知道有WCF和SOAP服务以及诸如此类的东西,但这些通常只是“clienty”类型东西的“中间件”

另一方面,Sun主要是一家服务器公司。在用户界面方面,他们的软件并不是最好的(这在Unix上不是一个小问题…只是Solaris..Mac OS X是基于Unix的,它有一个惊人的用户界面,两者之间的区别是Sun确实不像苹果那样关心用户界面)。他们甚至出售瘦客户机,试图将所有内容推送到服务器上

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

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

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

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

对于非常高的可靠性要求,检查异常可能会有所帮助。 如果有一个场景是你没有预料到的,而且对你的业务很重要的是,你要预料到所有的事情,然后让编译器告诉你。。。“嘿,你没有处理RocketFuelxHaustedException”会有帮助

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

对于微软来说,作为一家向客户软件开发人员销售开发人员工具的客户公司,检查异常当然是非常令人恼火的事情,它们妨碍了实际工作的完成


无论如何,这是我的$0.02…

异常显然是“异常”事件。在.net的范例中,异常永远不应该发生(这就是为什么您有像
TryParse
,…)这样的方法),因此强制处理无论如何都不应该发生的事件是没有意义的。

这是一个有趣的观点。遗憾的是,孙没有预料到会有空位!所以你的意思是Java代码更“企业化”,对吧?这是一些非常有趣的东西。“如果停电怎么办?”是的,抛出一个PowerOutageException。让我们看看你从中恢复过来:)我添加了“如果电源断了怎么办”作为另一个例子,说明服务器软件有时需要多么健壮。。。虽然,以一种超级学究式的吹毛求疵的方式,有可能(通过UPS或其他方式)抛出一个PowerOutageException,但这不是我的意思,只是对我来说似乎很牵强。“因为MS是一家客户公司,Sun是一家服务器公司”?Java的前身是为在机顶盒和其他嵌入式设备中使用而开发的。早期的Java被重新定位于浏览器和WWW。除了服务器什么都可以。那么这是如何适应的呢?那么EOFEException应该是s