CA1065:不要在非預期的位置中引發例外狀況

屬性
規則識別碼 CA1065
職稱 不要在非預期的位置中引發例外狀況
類別 設計
修正程式是中斷或非中斷 不中斷
預設在 .NET 8 中啟用 No

原因

不可擲回例外狀況 (Exception) 的方法卻擲回例外狀況。

檔案描述

不預期擲回例外狀況的方法可以分類如下:

  • 屬性 get 方法
  • 事件存取子方法
  • Equals 方法
  • GetHashCode 方法
  • ToString 方法
  • 靜態建構函式
  • 完成項
  • Dispose 方法
  • 等號比較運算子
  • 隱含轉換運算元

下列各節將討論這些方法類型。

屬性 get 方法

屬性基本上是智慧型手機欄位。 因此,它們的行為應該盡可能像欄位一樣。 欄位不會擲回例外狀況,而且兩者都不應該有屬性。 如果您有擲回例外狀況的屬性,請考慮將它設為方法。

您可以從屬性 get 方法擲回下列例外狀況:

事件存取子方法

事件存取子應該是不會擲回例外狀況的簡單作業。 當您嘗試新增或移除事件處理程式時,事件不應該擲回例外狀況。

您可以從事件存取子擲回下列例外狀況:

Equals 方法

下列 Equals 方法不應該擲回例外狀況:

Equals方法應該傳回 或 false ,而不是擲回true例外狀況。 例如,如果 Equals 傳遞了兩個不相符的類型,它應該只會傳回 false ,而不是擲回 ArgumentException

GetHashCode 方法

下列 GetHashCode 方法通常不應該擲回例外狀況:

GetHashCode 應該一律傳回值。 否則,您可以遺失哈希表中的專案。

採用 自變數的 GetHashCode 版本可能會擲回 ArgumentException。 不過, Object.GetHashCode 不應該擲回例外狀況。

ToString 方法

調試程式會使用 System.Object.ToString 來協助以字串格式顯示對象的相關信息。 因此, ToString 不應該變更物件的狀態,而且不應該擲回例外狀況。

靜態建構函式

從靜態建構函式擲回例外狀況會導致類型在目前的應用程式域中無法使用。 您應該有充分的理由(例如安全性問題)從靜態建構函式擲回例外狀況。

完成項

從完成項擲回例外狀況會導致 CLR 快速失敗,這會卸除進程。 因此,請避免在完成項中擲回例外狀況。

Dispose 方法

System.IDisposable.Dispose方法不應該擲回例外狀況。 Dispose 通常稱為 子句中清除邏輯的一 finally 部分。 因此,明確擲回例外 Dispose 狀況,會強制使用者在 子句內 finally 新增例外狀況處理。

程式 Dispose(false) 代碼路徑絕對不應該擲回例外狀況,因為 Dispose 幾乎一律會從完成項呼叫。

等號運算子 (==, !=)

和方法一樣 Equals ,等號運算符應該傳回 truefalse,而且不應該擲回例外狀況。

隱含轉換運算元

由於使用者通常不知道已呼叫隱含轉換運算符,因此隱含轉換運算子擲回的例外狀況是非預期的。 因此,不應從隱含轉換運算子擲回任何例外狀況。

如何修正違規

針對屬性 getter,請變更邏輯,使其不再需要擲回例外狀況,或將 屬性變更為方法。

針對先前列出的所有其他方法類型,請變更邏輯,使其不再擲回例外狀況。

隱藏警告的時機

如果違規是由例外狀況宣告所造成,而不是擲回的例外狀況,則隱藏來自此規則的警告是安全的。

隱藏警告

如果您只想要隱藏單一違規,請將預處理器指示詞新增至原始程式檔以停用,然後重新啟用規則。

#pragma warning disable CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065

若要停用檔案、資料夾或項目的規則,請在組態檔中將其嚴重性設定為 。none

[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none

如需詳細資訊,請參閱 如何隱藏程式代碼分析警告

另請參閱