方法: HRESULT に例外を割り当てる
COM のメソッドは、HRESULT を返すことによってエラーを報告します。.NET のメソッドは、例外をスローすることによってエラーを報告します。 ランタイムは、この 2 つの間の遷移を処理します。 .NET Framework のそれぞれの例外クラスが HRESULT に割り当てられます。
ユーザー定義の例外クラスは、適切な HRESULT であればどの HRESULT でも指定できます。 これらの例外クラスは、例外オブジェクトの HResult フィールドを設定することより、例外が生成されたときに返す HRESULT を動的に変更できます。 アンマネージ プロセスの .NET オブジェクトに実装されている IErrorInfo インターフェイスを通じて、クライアントに例外についての追加情報が提供されます。
System.Exception を拡張するクラスを作成する場合は、構築時に HRESULT フィールドを設定する必要があります。 それ以外の場合、HRESULT の値は基本クラスによって割り当てられます。 例外のコンストラクターに値を供給することにより、既存の HRESULT に新しい例外クラスを割り当てることができます。
スレッドに IErrorInfo がある場合、ランタイムが HRESULT を無視することがあることに注意してください。 この動作は、HRESULT と IErrorInfo が同じエラーを表明しない場合に発生します。
新しい例外クラスを作成し、HRESULT に割り当てるには
次のコードを使用し、新しい例外クラス NoAccessException を作成し、HRESULT E_ACCESSDENIED に割り当てます。
Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows { throw new NoAccessException(); }
マネージ コードとアンマネージ コードが同時に使用されているプログラム (任意のプログラミング言語) もあります。 たとえば、次のコード例のカスタム マーシャラーは、Marshal.ThrowExceptionForHR(int HResult) メソッドを使用して、特定の HRESULT 値を持つ例外をスローします。 このメソッドは、HRESULT を調べ、適切な例外型を生成します。 たとえば、次のコードの HRESULT は、ArgumentException を生成します。
CMyClass::MethodThatThrows
{
Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);
}
各 HRESULT から対応する .NET Framework の例外クラスへのすべての対応付けを次の表に示します。
HRESULT |
.NET の例外 |
---|---|
MSEE_E_APPDOMAINUNLOADED |
AppDomainUnloadedException |
COR_E_APPLICATION |
ApplicationException |
COR_E_ARGUMENT または E_INVALIDARG |
ArgumentException |
COR_E_ARGUMENTOUTOFRANGE |
ArgumentOutOfRangeException |
COR_E_ARITHMETIC または ERROR_ARITHMETIC_OVERFLOW |
ArithmeticException |
COR_E_ARRAYTYPEMISMATCH |
ArrayTypeMismatchException |
COR_E_BADIMAGEFORMAT または RROR_BAD_FORMAT |
BadImageFormatException |
COR_E_COMEMULATE_ERROR |
COMEmulateException |
COR_E_CONTEXTMARSHAL |
ContextMarshalException |
COR_E_CORE |
CoreException |
NTE_FAIL |
CryptographicException |
COR_E_DIRECTORYNOTFOUND または ERROR_PATH_NOT_FOUND |
DirectoryNotFoundException |
COR_E_DIVIDEBYZERO |
DivideByZeroException |
COR_E_DUPLICATEWAITOBJECT |
DuplicateWaitObjectException |
COR_E_ENDOFSTREAM |
EndOfStreamException |
COR_E_TYPELOAD |
EntryPointNotFoundException |
COR_E_EXCEPTION |
Exception |
COR_E_EXECUTIONENGINE |
ExecutionEngineException |
COR_E_FIELDACCESS |
FieldAccessException |
COR_E_FILENOTFOUND または ERROR_FILE_NOT_FOUND |
FileNotFoundException |
COR_E_FORMAT |
FormatException |
COR_E_INDEXOUTOFRANGE |
IndexOutOfRangeException |
COR_E_INVALIDCAST または E_NOINTERFACE |
InvalidCastException |
COR_E_INVALIDCOMOBJECT |
InvalidComObjectException |
COR_E_INVALIDFILTERCRITERIA |
InvalidFilterCriteriaException |
COR_E_INVALIDOLEVARIANTTYPE |
InvalidOleVariantTypeException |
COR_E_INVALIDOPERATION |
InvalidOperationException |
COR_E_IO |
IOException |
COR_E_MEMBERACCESS |
AccessException |
COR_E_METHODACCESS |
MethodAccessException |
COR_E_MISSINGFIELD |
MissingFieldException |
COR_E_MISSINGMANIFESTRESOURCE |
MissingManifestResourceException |
COR_E_MISSINGMEMBER |
MissingMemberException |
COR_E_MISSINGMETHOD |
MissingMethodException |
COR_E_MULTICASTNOTSUPPORTED |
MulticastNotSupportedException |
COR_E_NOTFINITENUMBER |
NotFiniteNumberException |
E_NOTIMPL |
NotImplementedException |
COR_E_NOTSUPPORTED |
NotSupportedException |
COR_E_NULLREFERENCE または E_POINTER |
NullReferenceException |
COR_E_OUTOFMEMORY または E_OUTOFMEMORY |
OutOfMemoryException |
COR_E_OVERFLOW |
OverflowException |
COR_E_PATHTOOLONG または ERROR_FILENAME_EXCED_RANGE |
PathTooLongException |
COR_E_RANK |
RankException |
COR_E_REFLECTIONTYPELOAD |
ReflectionTypeLoadException |
COR_E_REMOTING |
RemotingException |
COR_E_SAFEARRAYTYPEMISMATCH |
SafeArrayTypeMismatchException |
COR_E_SECURITY |
SecurityException |
COR_E_SERIALIZATION |
SerializationException |
COR_E_STACKOVERFLOW または ERROR_STACK_OVERFLOW |
StackOverflowException |
COR_E_SYNCHRONIZATIONLOCK |
SynchronizationLockException |
COR_E_SYSTEM |
SystemException |
COR_E_TARGET |
TargetException |
COR_E_TARGETINVOCATION |
TargetInvocationException |
COR_E_TARGETPARAMCOUNT |
TargetParameterCountException |
COR_E_THREADABORTED |
ThreadAbortException |
COR_E_THREADINTERRUPTED |
ThreadInterruptedException |
COR_E_THREADSTATE |
ThreadStateException |
COR_E_THREADSTOP |
ThreadStopException |
COR_E_TYPELOAD |
TypeLoadException |
COR_E_TYPEINITIALIZATION |
TypeInitializationException |
COR_E_VERIFICATION |
VerificationException |
COR_E_WEAKREFERENCE |
WeakReferenceException |
COR_E_VTABLECALLSNOTSUPPORTED |
VTableCallsNotSupportedException |
上記以外のすべての HRESULT |
COMException |
拡張されたエラー情報を取得するために、マネージ クライアントは、生成された例外オブジェクトの各フィールドを調べます。 例外オブジェクトでエラーについての有益な情報を提供できるようにするには、COM オブジェクトは、IErrorInfo インターフェイスを実装している必要があります。 ランタイムは、IErrorInfo によって提供される情報を使用して、例外オブジェクトを初期化します。
COM オブジェクトが IErrorInfo をサポートしていない場合、ランタイムは既定の値を使用して例外オブジェクトを初期化します。 次の表で、例外オブジェクトに関連付けられた各フィールドを一覧し、COM オブジェクトが IErrorInfo をサポートしている場合の既定の情報ソースを示します。
スレッドに IErrorInfo がある場合、ランタイムが HRESULT を無視することがあることに注意してください。 この動作は、HRESULT と IErrorInfo が同じエラーを表明しない場合に発生します。
例外フィールド |
COM からの情報のソース |
---|---|
ErrorCode |
呼び出しから返された HRESULT。 |
HelpLink |
IErrorInfo->HelpContext が 0 (ゼロ) 以外の場合は、文字列は IErrorInfo->GetHelpFile と "#" と IErrorInfo->GetHelpContext を連結して構成されます。 それ以外の場合は、文字列は、IErrorInfo->GetHelpFile から返されます。 |
InnerException |
常に null 参照 (Visual Basic では Nothing)。 |
Message |
IErrorInfo->GetDescription から返された文字列。 |
ソース |
IErrorInfo->GetSource から返された文字列。 |
StackTrace |
スタック トレース。 |
TargetSite |
失敗し、HRESULT を返したメソッドの名前。 |
Message、Source、StackTrace の各例外フィールドは、StackOverflowException では使用できません。