有没有不应该抛出异常的函数?
Are there any functions that should not throw exceptions?
在 C# .Net 中编程时,是否有任何函数抛出异常几乎总是“坏主意”?
在 C++ 中,从析构函数中抛出异常很少是个好主意,因为它通常会导致程序终止。 C#.Net中有没有类似的情况?我对异常被认为是糟糕风格的情况不感兴趣。我正在寻找抛出异常通常会导致严重问题的地方。
- 静态构造函数或类型构造函数。如果有未处理的
exception 该类型不会被加载到应用程序域中
并且每次您尝试调用它时都会 return 最后一个异常。
- 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
是合理的,如果异常从中冒出,那么您可能已经为时已晚,无法正确处理异常。
在 C# .Net 中编程时,是否有任何函数抛出异常几乎总是“坏主意”?
在 C++ 中,从析构函数中抛出异常很少是个好主意,因为它通常会导致程序终止。 C#.Net中有没有类似的情况?我对异常被认为是糟糕风格的情况不感兴趣。我正在寻找抛出异常通常会导致严重问题的地方。
- 静态构造函数或类型构造函数。如果有未处理的 exception 该类型不会被加载到应用程序域中 并且每次您尝试调用它时都会 return 最后一个异常。
- 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
是合理的,如果异常从中冒出,那么您可能已经为时已晚,无法正确处理异常。