问题描述
在 C# .Net 中编程时,是否有任何函数抛出异常几乎总是“坏主意”?
在 C++ 中,从析构函数中抛出异常很少是一个好主意,因为它通常会导致程序终止。 C# .Net 中是否有类似的情况?我对异常被认为是不好的风格的情况不感兴趣。我正在寻找抛出异常通常会导致严重问题的地方。
解决方法
- 静态构造函数或类型构造函数。如果有未处理的 异常类型不会加载到应用程序域中 并且每次尝试调用它时都会返回最后一个异常。
- in the finalizer
除了提到的其他地方,我还要添加 async void
方法,特别是在第一个 await
之后。这里的问题是,如果 await 需要重新调度,那么从方法中冒出来的任何异常都可能落在意外的位置。例如。如果您使用 .ConfigureAwait(false)
等待或从后台线程调用 async void
方法,则异常将进入线程池,并直接进入未处理状态。
话虽如此,我认为只有少数地方使用 async void
是合理的,如果异常冒泡出来,那么您可能已经太晚了,无论如何都无法正确处理异常。>
Microsoft 的设计规则 CA1065(不要在意外位置引发异常)涵盖了这一点,其中规定:
不期望抛出异常的方法可以归类 如下:
- 属性获取方法
- 事件访问器方法
- 等于方法
- GetHashCode 方法
- ToString 方法
- 静态构造函数
- 终结者
- 处理方法
- 平等运算符
- 隐式转换运算符