簡體   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