標準の例外の種類のキャッチとスロー

以下のガイドラインでは、.NET Framework によって提供される例外の中で、最もよく使用されているいくつかの例外について、その推奨事項を示します。

例外と SystemException

System.Exception や System.SystemException はスローしないでください。

再スローを目的にする場合を除き、System.Exception や System.SystemException をフレームワーク コードでキャッチしないでください。

System.Exception や System.SystemException を最上位の例外ハンドラー以外でキャッチするのは避けてください。

ApplicationException

カスタム例外は、T:System.ApplicationException クラスではなく T:System.Exception クラスから派生してください。

本来、カスタム例外は ApplicationException クラスから派生しなければならないと考えられていましたが、それによって大きな価値が付加されたことはないようです。 詳細については、「例外処理の実施」を参照してください。

InvalidOperationException

不適切な状態では、System.InvalidOperationException 例外をスローしてください。 オブジェクトの現在の状態から判断して、プロパティ セットやメソッド呼び出しが不適切な場合は、System.InvalidOperationException をスローする必要があります。 たとえば、読み込み用として開かれている System.IO.FileStream に書き込みが行われた場合は、System.InvalidOperationException 例外をスローしてください。

この例外は、関連するオブジェクト セットの状態の組み合わせが、操作に対して無効な場合にもスローする必要があります。

ArgumentException、ArgumentNullException、および ArgumentOutOfRangeException

不適切な引数がメンバーに渡された場合は、System.ArgumentException またはそのサブタイプのいずれかをスローしてください。 妥当な場合は、最派生例外をスローすることをお勧めします。

引数が null (Visual Basic では Nothing) の場合に例外をスローするコード例を次に示します。

If (anObject = Nothing) Then
    Throw New ArgumentNullException("anObject", "Specify a non-null argument.")
End If
if (anObject == null)
{
    throw new ArgumentNullException("anObject",
        "Specify a non-null argument.");
}
if (anObject == nullptr)
{
    throw gcnew ArgumentNullException("anObject",
        "Specify a non-null argument.");
}

System.ArgumentException またはその派生型のいずれかをスローする場合は、System.ArgumentException.ParamName プロパティを設定してください。 このプロパティは、例外をスローする原因になったパラメーターの名前を格納します。 このプロパティは、コンストラクターのオーバーロードのいずれかを使用して設定できます。

プロパティ Set アクセス操作子 の暗黙の値パラメーターの名前を表す値を使用してください。

呼び出し元が null 引数を渡した場合に例外をスローするプロパティを次のコード例に示します。

Public Property Address() As IPAddress
    Get
        Return IPaddr
    End Get
    Set(ByVal value As IPAddress)
        If IsNothing(value) Then
            Throw New ArgumentNullException("value")
        End If
        IPaddr = value
    End Set
End Property
public IPAddress Address
{
    get
    {
        return address;
    }
    set
    {
        if(value == null)
        {
            throw new ArgumentNullException("value");
        }
        address = value;
    }
}
property IPAddress^ Address
{
    IPAddress^ get()
    {
        return address;
    }
    void set(IPAddress^ value)
    {
        if (value == nullptr)
        {
            throw gcnew ArgumentNullException("value");
        }
        address = value;
    }
}

パブリックに呼び出し可能な API に、System.NullReferenceException、System.AccessViolationException、System.InvalidCastException、System.IndexOutOfRangeException の各例外を明示的または暗黙にスローさせないでください。 引数チェックを行って、これらの例外をスローするのを避けてください。 これらの例外をスローすると、時間と共に変更される可能性があるメソッドの実装の詳細が公開されます。

StackOverflowException

System.StackOverflowException を明示的にスローしないでください。 この例外は、共通言語ランタイム (CLR: Common Language Runtime) によってのみ明示的にスローされる必要があります。

System.StackOverflowException をキャッチしないでください。

スタック オーバーフローをプログラムによって処理するのはきわめて困難です。 この例外でプロセスを終了できるようにし、デバッグを使って問題の原因を特定する必要があります。

OutOfMemoryException

System.OutOfMemoryException を明示的にスローしないでください。 この例外は、CLR インフラストラクチャによってのみスローされる必要があります。

ComException と SEHException

System.Runtime.InteropServices.COMException や System.Runtime.InteropServices.SEHException を明示的にスローしないでください。 これらの例外は、CLR インフラストラクチャによってのみスローされる必要があります。

System.Runtime.InteropServices.SEHException を明示的にキャッチしないでください。

ExecutionEngineException

System.ExecutionEngineException を明示的にスローしないでください。

Portions Copyright 2005 Microsoft Corporation. All rights reserved.

Portions Copyright Addison-Wesley Corporation. All rights reserved.

設計ガイドラインの詳細についてを参照してください、「フレームワークの設計ガイドライン。規則、慣用句、および再利用可能なパターン。ネット ライブラリ」本クシシュトフ Cwalina、ブラッド エイブラムス、アスキー、2005 年発表しました。

参照

概念

スローする正しい種類の例外の選択

その他の技術情報

クラス ライブラリ開発のデザイン ガイドライン

例外のデザインのガイドライン