次の方法で共有


HRESULT と例外

COM のメソッドは、HRESULT を返すことによってエラーを報告します。.NET のメソッドは、例外をスローすることによってエラーを報告します。ランタイムは、この 2 つの間の遷移を処理します。.NET Framework のそれぞれの例外クラスが HRESULT に割り当てられます。

ユーザー定義の例外クラスは、適切な HRESULT であればどの HRESULT でも指定できます。これらの例外クラスは、例外オブジェクトの HResult フィールドを設定することより、例外が生成されたときに返す HRESULT を動的に変更できます。アンマネージ プロセスの .NET オブジェクトに実装されている IErrorInfo インターフェイスを通じて、クライアントに例外についての追加情報が提供されます。

System.Exception を拡張するクラスを作成する場合は、構築時に HRESULT フィールドを設定する必要があります。それ以外の場合、HRESULT の値は基本クラスによって割り当てられます。例外のコンストラクタに値を供給することにより、既存の 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 をサポートしている場合の既定の情報ソースを示します。

例外フィールド COM からの情報のソース
ErrorCode 呼び出しから返された HRESULT。
HelpLink IErrorInfo->HelpContext が 0 (ゼロ) 以外の場合は、文字列は IErrorInfo->GetHelpFile と "#" と IErrorInfo->GetHelpContext を連結して構成されます。それ以外の場合は、文字列は、IErrorInfo->GetHelpFile から返されます。
InnerException 常に null 参照 (Visual Basic では Nothing)。
Message IErrorInfo->GetDescription から返された文字列。
Source IErrorInfo->GetSource から返された文字列。
StackTrace スタック トレース。
TargetSite 失敗し、HRESULT を返したメソッドの名前。

MessageSourceStackTrace の各例外フィールドは、StackOverflowException では使用できません。

参照

高度な COM 相互運用機能 | 例外の処理とスロー