【问题标题】:C# explicitly defining what exceptions are thrownC# 明确定义抛出的异常
【发布时间】:2010-11-03 14:33:38
【问题描述】:

在 Java 中,您可以使用“throws”关键字明确定义抛出哪些异常。这样,任何调用您的方法的人都知道要捕获什么。

C# 中有什么东西吗?如果没有,我如何知道要捕获哪些异常,或者如何让其他人知道要捕获哪些异常?

另外,如果我定义一个接口,有没有办法说“methodX() 应该在错误时抛出这个异常”?

【问题讨论】:

  • 我想 .NET 框架的版本在这里会有所作为,但在我使用的版本中,答案是:你很好地记录了潜在的异常,并且没有 - 没有办法强制异常的类型抛出(没有捕获所有异常,并将它们重新包装成您喜欢的类型)。这不仅仅是您可能在方法中生成的异常,还有任何您正在冒泡的异常。

标签: c# exception interface


【解决方案1】:

C# 中没有等价物:The Trouble with Checked Exceptions

除了文档,没有办法声明一个接口说“methodX() 应该在错误时抛出这个异常”。

【讨论】:

  • @dbkk:他的反对在很大程度上是错误的。例如,他抱怨你不能在不改变 API 的情况下在实现中抛出新类型的异常,所以旧的客户端代码不能调用它。这是真的,但也是可取的。如果您抛出新的异常,API 已更改,无论是否在其中显式指定异常。就我个人而言,我宁愿让客户端在尝试使用 API 时立即发生可怕而壮观的故障,而不是由于我没有处理所有异常而以微妙的方式进一步失败。
  • @JeremyP,我宁愿花时间完成经过验证的任务以减少错误,例如代码审查和编写更多测试。考虑到编程时间的成本,已检查的异常从未被证明可以阻止大量的错误。
  • @Ian Ringrose:事实证明,正确处理错误情况可以减少错误。事实证明,拥有定义良好的显式 API 可以减少错误。忽略异常不是。
  • @JeramyP,但您应该编写代码以检查操作在之前是否有效,因此不应常见异常。
  • Ian Ringrose,SOLID 中的 LSP 对此非常清楚。 @JeramyP 建议的方法是我的首选解决方案。 'Adaptive Code via C#' 是一本很棒的书,它解释了你应该如何处理这个问题,以及它对解决方案的其余部分和其他实现的影响。如果我想在不更改 API 的情况下添加新异常,我会尝试扩展当前使用的异常。 Liskov Substitution Principle, WikipediaAdaptive Code via C#
【解决方案2】:

C#/.net 没有检查异常,事实证明它们在大型系统中的用处比最初想象的要小。在许多项目中,维护检查异常规范所花费的时间远远超过拥有它们所节省的调试时间。

Checked Exceptions 似乎是一个很好的理想选择,除非您有可以将委托或调用传入您传入的对象的方法。举个简单的例子,列表上的 Sort() 方法不知道它会抛出什么异常,因为它不知道正在排序的对象上的 Compar() 方法会抛出什么异常。

因此,方法可能抛出的异常的规范必须能够包含有关如何从传入的对象和委托中填充异常的信息。 没有人知道如何做到这一点!

但是,您可以使用一些工具检查是否捕获了所有异常 - 请参阅 Red Gate 的 Exception Hunter。我个人认为这些工具没有多大价值,但是如果您喜欢检查异常,您可能会发现它们很有用。

【讨论】:

    【解决方案3】:

    此功能在 C# 中不可用。您可以制作适当的 XML 文档(3 个斜线 ///)并说明正在抛出哪些异常。

    这将被 IntelliSense 机制拾取,并在类/方法的用户使用之前可见。

    【讨论】:

      【解决方案4】:

      C# 不支持这一点。 (反正我不知道)。 您可以做的是使用 Xml 注释,以便在调用您的方法时,这些数据将由智能感知显示。

      【讨论】:

        【解决方案5】:

        据我所知,C# 中没有 throws 声明,您可以记录您的方法,表明它抛出异常但没有强制错误处理。

        【讨论】:

        • 哈哈,我花了这么多时间才写这两个已经发布了!
        【解决方案6】:

        C# 不支持检查异常。语言设计者认为 java 使用检查异常的方式是个坏主意。

        Some workarounds

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-30
          • 1970-01-01
          • 1970-01-01
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多