CA1065:予期しない場所に例外を発生させません

プロパティ
ルール ID CA1065
Title 予期しない場所に例外を発生させません
[カテゴリ] デザイン
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 いいえ

原因

例外をスローしないはずのメソッドが例外をスローします。

規則の説明

例外をスローしないはずのメソッドは、次のように分類できます。

  • プロパティの get メソッド

  • イベントのアクセサー メソッド

  • Equals メソッド

  • GetHashCode メソッド

  • ToString メソッド

  • 静的コンストラクター

  • ファイナライザー

  • Dispose メソッド

  • 等値演算子

  • 暗黙的キャスト演算子

以下のセクションでは、これらのメソッドの種類について説明します。

プロパティの get メソッド

プロパティは基本的にスマート フィールドです。 そのため、それらは可能な限りフィールドのように動作する必要があります。 フィールドから例外はスローされないので、プロパティでもスローされません。 例外をスローするプロパティがある場合は、メソッドにすることを検討します。

プロパティの get メソッドからは、次の例外がスローされる可能性があります。

イベントのアクセサー メソッド

イベント アクセサーは、例外をスローしない単純な操作である必要があります。 イベント ハンドラーを追加または削除しようとしたときに、イベントで例外がスローされないようにする必要があります。

イベント アクセサーからは、次の例外がスローされる可能性があります。

Equals メソッド

次の Equals メソッドから例外がスローされてはなりません。

Equals メソッドからは、例外をスローする代わりに、true または false を返す必要があります。 たとえば、Equals に 2 つの一致しない型が渡された場合、ArgumentException をスローするのではなく、false を返すだけにする必要があります。

GetHashCode メソッド

次の GetHashCode メソッドからは、通常、例外をスローしないようにする必要があります。

GetHashCode からは、常に値を返す必要があります。 そうしないと、ハッシュ テーブル内の項目が失われる可能性があります。

引数を受け取るバージョンの GetHashCode からは、ArgumentException をスローできます。 ただし、Object.GetHashCode から例外をスローすることはできません。

ToString メソッド

System.Object.ToString は、オブジェクトに関する情報を文字列形式で表示するために、デバッガーによって使用されます。 したがって、ToString でオブジェクトの状態を変更してはならず、例外をスローすることはできません。

静的コンストラクター

静的コンストラクターから例外をスローすると、現在のアプリケーション ドメインでその型を使用できなくなります。 静的コンストラクターから例外をスローするには、適切な理由 (セキュリティの問題など) が必要です。

ファイナライザー

ファイナライザーから例外をスローすると、CLR がフェイル ファストし、プロセスが破棄されます。 したがって、ファイナライザーで例外をスローすることは常に避ける必要があります。

Dispose メソッド

System.IDisposable.Dispose メソッドで例外をスローしてはなりません。 Dispose は、finally 句でのクリーンアップ ロジックの一部として呼び出されることがよくあります。 したがって、Dispose から明示的に例外をスローすると、ユーザーは finally 句内に例外処理を追加するように強制されます。

ほとんどの場合、Dispose はファイナライザーから呼び出されるため、Dispose(false) コード パスで例外をスローしてはなりません。

等値演算子 (==、!=)

Equals メソッドと同様に、等値演算子からは true または false のいずれかを返す必要があり、例外をスローしてはなりません。

暗黙的キャスト演算子

ユーザーは、暗黙的キャスト演算子が呼び出されたことを認識しないことがよくあるため、暗黙的キャスト演算子によってスローされる例外は予期されていません。 したがって、暗黙的キャスト演算子から例外をスローしてはなりません。

違反の修正方法

プロパティのゲッターの場合は、例外をスローする必要がないようにロジックを変更するか、プロパティをメソッドに変更します。

上で示した他のすべてのメソッドの種類については、例外をスローする必要がないようにロジックを変更します。

どのようなときに警告を抑制するか

スローされる例外ではなく例外の宣言によって違反が発生した場合は、この規則からの警告を抑制しても安全です。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#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

詳細については、「コード分析の警告を抑制する方法」を参照してください。

関連項目