CA2201:予約された例外の種類を発生させません

プロパティ 値
ルール ID CA2201
Title 予約された例外の種類を発生させません
[カテゴリ] 使用方法
修正が破壊的か非破壊的か 速報
.NET 10 で既定で有効 いいえ
該当する言語 C# と Visual Basic

原因

メソッドによって、一般的すぎる、またはランタイムによって予約されている種類の例外が発生します。

規則の説明

次の例外の種類は、一般的すぎて、ユーザーに十分な情報を提供できません。

次の例外の種類は予約されており、共通言語ランタイムによってのみスローされる必要があります。

一般的な例外をスローしない

ライブラリまたはフレームワーク内で Exception や SystemException などの一般的な例外の種類をスローすると、コンシューマーは、処理方法がわからない不明な例外も含め、すべての例外をキャッチすることを強制されます。

代わりに、フレームワークに既に存在する派生型をスローするか、Exception から派生する独自の型を作成します。

特定の例外をスローする

次の表は、プロパティのsetアクセサーのvalueパラメーターを含むさまざまな種類の無効な引数に対して、どの例外をスローするかを示しています。

引数が無効です 例外
null 参照 ArgumentNullException
許容範囲の値 (コレクションまたはリストに対するインデックスなど) 以外 ArgumentOutOfRangeException
無効な enum 値 InvalidEnumArgumentException
メソッドのパラメーター仕様 (ToString(String) に対する書式文字列など) を満たさない書式が含まれている FormatException
それ以外の場合は無効 ArgumentException

次の表は、無効操作の種類に応じてスローする例外を示しています。

無効な操作 例外
操作がオブジェクトの現在の状態に対して無効です。 InvalidOperationException
操作が破棄されたオブジェクトに対して実行されました。 ObjectDisposedException
操作はサポートされていません (読み取り用に開かれたストリームでのStream.Writeのオーバーライドなどの場合)。 NotSupportedException
変換によってオーバーフローが発生します (明示的なキャスト演算子のオーバーロードなど)。 OverflowException

その他のすべての状況では、Exception から派生する独自のタイプを作成することを検討し、それをスローします。

違反の修正方法

この規則の違反を修正するには、スローされる例外の型を、予約済みの型ではない特定の型に変更します。

Example

// This code violates the rule.
throw new Exception();
throw new NullReferenceException();
throw new IndexOutOfRangeException();
// ...

// This code satisfies the rule.
throw new ArgumentException();
throw new ArgumentNullException();
throw new InvalidOperationException();
// ...

// A minimal implementation of inheritance from Exception
public class CustomException : Exception { }

// Or create your own type that derives from Exception
// This code satisfies the rule too.
throw new CustomException();

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

この規則による警告は抑制しないでください。