有没有不应该抛出异常的函数?

Are there any functions that should not throw exceptions?

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

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

  1. 静态构造函数或类型构造函数。如果有未处理的 exception 该类型不会被加载到应用程序域中 并且每次您尝试调用它时都会 return 最后一个异常。
  2. in the finalizer

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

Methods that are not expected to throw exceptions can be categorized as follows:

  • Property Get Methods
  • Event Accessor Methods
  • Equals Methods
  • GetHashCode Methods
  • ToString Methods
  • Static Constructors
  • Finalizers
  • Dispose Methods
  • Equality Operators
  • Implicit Cast Operators

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

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