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

问题描述

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

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

解决方法

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

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

话虽如此,我认为只有少数地方使用 async void 是合理的,如果异常冒泡出来,那么您可能已经太晚了,无论如何都无法正确处理异常。>

,

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

不期望抛出异常的方法可以归类 如下:

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