繁体   English   中英

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

[英]Are there any functions that should not throw exceptions?

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

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

  1. static 构造函数或类型构造函数。 如果存在未处理的异常,则该类型将不会加载到应用程序域中,并且每次您尝试调用它时都会返回最后一个异常。
  2. 在终结器中

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

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

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

预计不会抛出异常的方法可以分类如下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM