【问题标题】:Are there any functions that should not throw exceptions?有没有不应该抛出异常的函数?
【发布时间】:2021-05-14 16:51:29
【问题描述】:

在 C# .Net 中编程时,是否有任何函数抛出异常几乎总是一个“坏主意”?

在 C++ 中,从析构函数中抛出异常并不是一个好主意,因为它通常会导致程序终止。 C# .Net 中是否有类似的情况?我对异常被认为是不好的风格的情况不感兴趣。我正在寻找抛出异常通常会导致严重问题的地方。

【问题讨论】:

  • 这只是一个政策。我在一个规则是总是扔它的地方工作。
  • 感谢您的链接。真的很有帮助!
  • 这在 C++ 中是完全不同的考验,std::terminate() 不会让任何人猜到程序为何终止。 C# 没有这个问题,您可以(几乎)始终获得良好的堆栈跟踪。 (几乎)条款为本网站提供了它的名称。唯一需要担心的是程序实际上试图捕获异常。不要从运行在 finally 块中的代码抛出,它会替换活动异常。

标签: c# .net clr


【解决方案1】:
  1. 静态构造函数或类型构造函数。如果有未处理的 异常类型将不会加载到应用程序域中 并且每次您尝试调用它时都会返回最后一个异常。
  2. in the finalizer

【讨论】:

    【解决方案2】:

    除了提到的其他地方,我会添加async void 方法,特别是在第一个await 之后。这里的问题是,如果 await 需要重新安排,那么任何从方法中冒出来的异常都可能出现在意想不到的位置。例如。如果您使用 .ConfigureAwait(false) 等待,或者如果从后台线程调用 async void 方法,则异常将进入线程池,并具有直接变为未处理的路径。

    话虽如此,我认为只有少数地方可以使用async void,如果出现异常,那么您可能已经为时已晚,无法正确处理异常。

    【讨论】:

      【解决方案3】:

      微软的设计规则CA1065(不要在意外位置引发异常)涵盖了这一点,其中规定:

      可以对不期望抛出异常的方法进行分类 如下:

      • 属性获取方法
      • 事件访问器方法
      • 等于方法
      • GetHashCode 方法
      • ToString 方法
      • 静态构造函数
      • 终结者
      • 处置方法
      • 等式运算符
      • 隐式转换运算符

      【讨论】:

        猜你喜欢
        • 2017-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 2016-08-14
        • 2012-01-02
        • 1970-01-01
        相关资源
        最近更新 更多