次の方法で共有


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

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

原因

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

規則の説明

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

  • プロパティの 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

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

関連項目