次の方法で共有


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

プロパティ
ルール ID CA1065
Title 予期しない場所に例外を発生させません
[カテゴリ] デザイン
修正が破壊的か非破壊的か なし
.NET 10 で既定で有効 いいえ
該当する言語 C# と Visual Basic

原因

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

規則の説明

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

  • プロパティ取得メソッド
  • イベント アクセサー メソッド
  • Equals メソッド
  • GetHashCode メソッド
  • ToString メソッド
  • 静的コンストラクター
  • ファイナライザー
  • Dispose メソッド
  • 等値演算子
  • 暗黙的なキャスト演算子

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

プロパティの取得メソッド

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

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

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

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

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

Equals メソッド

次の Equals メソッドは、例外をスローしてはなりません。

Equals メソッドは、例外をスローするのではなく、trueまたはfalseを返す必要があります。 たとえば、Equalsが 2 つの不一致の型を渡された場合、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メソッドと同様に、等値演算子は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

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

関連項目