为什么 .NET 中不检查异常?

2023-11-26

我知道谷歌搜索我可以找到合适的答案,但我更喜欢听听您的个人(也许是技术)意见。
Java 和 C# 在抛出异常方面存在差异的主要原因是什么?
在 Java 中,抛出异常的方法的签名必须使用“throws”关键字,而在 C# 中,您不知道在编译时是否可以抛出异常。


文章中检查异常的麻烦根据 Anders Hejlsberg(C# 语言的设计者)自己的说法,C# 不支持在 Java 中发现和验证检查异常的三个主要原因:

  • 对检查异常持中立态度

    “C# 基本上对检查保持沉默 例外问题。曾经更好 解决方案是已知的——相信我,我们 继续想一想——我们可以走了 回来并实际放入一些东西 地方。”

  • 带有受检异常的版本控制

    “向抛出添加新的异常 新版本中的子句破坏了客户端 代码。这就像向一个对象添加一个方法 界面。在您发布 界面,适合大家实用 目的一成不变,……”

    “有趣的是,人们认为 关于异常的重要一点是 处理它们。那不是 关于例外的重要事情。在一个 写得好的应用程序有一个 我认为十比一的比例 最后尝试尝试捕获。或者在 C# 中,using语句,它们是 就像最后尝试一样。”

  • 检查异常的可扩展性

    “在小的、已检查的异常中 非常诱人……麻烦 当你开始建造大型建筑时就开始了 您正在与四个人交谈的系统 或五个不同的子系统。每个 子系统抛出四到十 例外情况。现在,每次你走上前去 聚合的阶梯,你有 你下面这个指数级的等级制度 您必须处理的异常情况。 你最终必须申报 40 您可能会抛出的异常。... 它只是膨胀失控。”

在他的文章中,“为什么 C# 没有异常规范?”, 安森霍顿(Visual C# 程序管理器)还列出了以下原因(有关每点的详细信息,请参阅文章):

  • 版本控制
  • 生产力和代码质量
  • 让课程作者区分以下内容是不切实际的checked and 未经检查的例外情况
  • 难以确定接口的正确异常。

有趣的是,尽管如此,C# 确实支持通过给定方法抛出异常的文档<exception>标签和编译器甚至不厌其烦地验证引用的异常类型确实存在。但是,不会在调用站点或方法的使用上进行检查。

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

Exception Hunter 是一种新的分析 查找并报告一组的工具 您的功能可能存在的异常 可能会在发货之前抛出。 有了它,您可以找到未处理的 轻松快速地排除异常,直至 抛出的代码行 例外情况。当你得到结果后, 您可以决定需要哪些例外 待处理(有一些例外 处理代码)在你发布之前 应用到野外。

最后,布鲁斯·埃克尔,作者用Java思考,有一篇文章叫做“Java 需要检查异常吗?”,这可能也值得一读,因为为什么 C# 中不存在检查异常的问题通常是在与 Java 的比较中扎根的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 .NET 中不检查异常? 的相关文章

随机推荐