更新 : 2007 年 11 月
以下のガイドラインでは、.NET Framework によって提供される例外の中で、最もよく使用されているいくつかの例外について、その推奨事項を示します。Framework によって提供される例外クラスの完全な一覧については、「.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.");
}
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;
}
}
パブリックに呼び出し可能な 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.
デザイン ガイドラインの詳細については、2005 年に Addison-Wesley から出版されている Krzysztof Cwalina、Brad Abrams 共著の『Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries』を参照してください。