Java 为什么不在.NET中签入异常?

Java 为什么不在.NET中签入异常?,java,.net,exception,Java,.net,Exception,我知道谷歌搜索可以找到一个合适的答案,但我更喜欢听你的个人(或许还有技术)意见。 Java和C在抛出异常方面存在差异的主要原因是什么? 在Java中,抛出异常的方法的签名必须使用“throws”关键字,而在C中,您不知道在编译时是否会抛出异常。C的基本设计思想是,实际上捕获异常很少有用,而在异常情况下清理资源是非常重要的。我认为可以公平地说,使用(IDisposable模式)是他们对已检查异常的回答。有关更多信息,请参见[1] 因为对选中异常的响应几乎总是: try { // except

我知道谷歌搜索可以找到一个合适的答案,但我更喜欢听你的个人(或许还有技术)意见。
Java和C在抛出异常方面存在差异的主要原因是什么?

在Java中,抛出异常的方法的签名必须使用“throws”关键字,而在C中,您不知道在编译时是否会抛出异常。

C的基本设计思想是,实际上捕获异常很少有用,而在异常情况下清理资源是非常重要的。我认为可以公平地说,
使用
(IDisposable模式)是他们对已检查异常的回答。有关更多信息,请参见[1]


  • 因为对选中异常的响应几乎总是:

    try {
      // exception throwing code
    } catch(Exception e) {
       // either
       log.error("Error fooing bar",e);
       // OR
       throw new RuntimeException(e);
    }
    
    如果您确实知道在抛出特定异常时可以执行某些操作,那么您可以捕获该异常并进行处理,但除此之外,这只是安抚编译器的咒语。

    由于作业更改,我从Java转到C。起初,我有点担心这种差异,但在实践中,它并没有带来什么不同

    也许是因为我来自C++,它有异常声明,但它不常用。我把每一行代码都写得好像它可以抛出一样——总是使用一次性的,并考虑最后应该做的清理

    回想起来,在Java中传播throws声明并没有让我得到任何东西


    我想说的是,函数绝对不会抛出——我认为这会更有用。

    除了已经编写的响应之外,没有检查异常在许多情况下对您有很大帮助。检查过的异常使泛型更难实现,如果您阅读过闭包建议,您会注意到每个闭包建议都必须以一种相当丑陋的方式处理检查过的异常。

    到.NET设计时,Java检查异常已经有相当长的一段时间了,Java开发人员充其量也将此功能视为一种新功能。因此.NET设计人员没有将其包含在C语言中。

    有趣的是,微软研究院的人员在他们的C语言超集中添加了检查异常。

    我有时会忽略C/NET中的检查异常

    我想除了Java之外,没有其他著名的平台拥有它们。也许.NET的人只是随波逐流…

    在文章中以及Anders Hejlsberg(C#语言的设计者)自己的声音中,C#不支持在Java中发现和验证的检查异常有三个主要原因:

    • 检查异常时保持中立

      “C#基本上在屏幕上保持沉默 例外问题。一次更好 解决方案是已知的,相信我,我们 继续考虑我们可以走了 回来放点东西进去 地点。”

    • 带有选中异常的版本控制

      “将一个新异常添加到 新版本中的子句中断了客户端 代码。这就像向 接口。在发布 接口,这是所有实用的 目的不变,……”

      “有趣的是,人们认为 关于异常的重要一点是 处理它们,这不是问题所在 关于异常的重要事情。在 写得很好的申请有一个 在我看来,十比一的比例 最后试着去抓。或者用C#, 语句,它们是 就像最后一次尝试。”

    • 已检查异常的可扩展性

      “在小范围内,选中的异常是 非常诱人…麻烦 当你开始建造大型建筑时开始 你和四个人谈话的系统 或者五个不同的子系统,每个子系统 子系统抛出四到十次 例外。现在,每次你走上去 聚集的阶梯,你有 这是你下面的指数等级 你必须处理的例外情况。 你最后不得不申报40英镑 您可能抛出的异常。… 它只是失控了。”

    在他的文章中,“(Visual C#Program Manager)还列出了以下原因(有关每一点的详细信息,请参阅文章):

    • 版本控制
    • 生产力和代码质量
    • 让类作者区分 已检查和未检查的异常
    • 确定接口的正确异常的困难
    值得注意的是,尽管如此,C#仍然支持通过标记记录给定方法引发的异常,编译器甚至不厌其烦地验证引用的异常类型是否确实存在。但是,没有在调用站点进行检查,也没有使用该方法

    您可能还想研究,这是一个商业工具,它使用静态分析来确定和报告方法引发的异常,这些异常可能会未被捕获:

    异常猎人是一种新的分析方法 用于查找和报告数据集的工具 您的功能可能出现的异常 可能会扔——甚至在你发货之前。 使用它,您可以找到未处理的文件 可以轻松快速地执行异常,具体到 正在抛出 例外情况。一旦你有了结果, 您可以决定需要哪些异常 被处理(有例外) 处理代码),然后再释放 应用到野外


    最后,的作者,有一篇文章叫“”,可能也值得一读,因为为什么C#中没有检查异常的问题,通常源于与Java的比较。

    从根本上说,是否应该处理异常是调用方的属性,而不是函数的属性

    例如,在某些程序中,处理IOException没有任何价值(请考虑执行数据处理的特殊命令行实用程序;它们永远不会有价值)