方法: HRESULT に例外を割り当てるHow to: Map HRESULTs and Exceptions

COM メソッドでは、HRESULT を返してエラーを報告します。 .NET メソッドでは、例外をスローしてエラーを報告します。COM methods report errors by returning HRESULTs; .NET methods report them by throwing exceptions. ランタイムは、この 2 つの間の遷移を処理します。The runtime handles the transition between the two. .NET Framework の例外クラスはそれぞれ HRESULT に割り当てられます。Each exception class in the .NET Framework maps to an HRESULT.

ユーザー定義の例外クラスは、適切な HRESULT であればどの HRESULT でも指定できます。User-defined exception classes can specify whatever HRESULT is appropriate. これらの例外クラスでは、例外オブジェクトの HResult フィールドを設定することで例外が生成されたときに返される HRESULT を動的に変更できます。These exception classes can dynamically change the HRESULT to be returned when the exception is generated by setting the HResult field on the exception object. アンマネージ プロセスの .NET オブジェクトに実装されている IErrorInfo インターフェイスを通じて、クライアントに例外についての追加情報が提供されます。Additional information about the exception is provided to the client through the IErrorInfo interface, which is implemented on the .NET object in the unmanaged process.

System.Exception を拡張するクラスを作成する場合は、構築中に HRESULT フィールドを設定する必要があります。If you create a class that extends System.Exception, you must set the HRESULT field during construction. それ以外の場合は、基本クラスで HRESULT 値が割り当てられます。Otherwise, the base class assigns the HRESULT value. 例外のコンストラクターで値を指定することで、既存の HRESULT に新しい例外クラスを割り当てることができます。You can map new exception classes to an existing HRESULT by supplying the value in the exception's constructor.

スレッドに IErrorInfo がある場合、ランタイムが HRESULT を無視することがあることに注意してください。Note that the runtime will sometimes ignore an HRESULT in cases where there is an IErrorInfo present on the thread. この動作は、HRESULTIErrorInfo が同じエラーを表していない場合に発生する可能性があります。This behavior can occur in cases where the HRESULT and the IErrorInfo do not represent the same error.

新しい例外クラスを作成し、HRESULT に割り当てるにはTo create a new exception class and map it to an HRESULT

  1. 次のコードを使用して、NoAccessException という新しい例外クラスを作成し、HRESULT E_ACCESSDENIED に割り当てます。Use the following code to create a new exception class called NoAccessException and map it to the HRESULT E_ACCESSDENIED.

    Class NoAccessException : public ApplicationException  
    {  
        NoAccessException () {  
        HResult = E_ACCESSDENIED;   
    }  
    }  
    CMyClass::MethodThatThrows  
    {  
    throw new NoAccessException();  
    }  
    

マネージド コードとアンマネージド コードの両方を同時に使用する (任意のプログラミング言語の) プログラムもあります。You might encounter a program (in any programming language) that uses both managed and unmanaged code at the same time. たとえば、次のコード例のカスタム マーシャラーは、Marshal.ThrowExceptionForHR(int HResult) メソッドを使用して、特定の HRESULT 値を持つ例外をスローします。For example, the custom marshaler in the following code example uses the Marshal.ThrowExceptionForHR(int HResult) method to throw an exception with a specific HRESULT value. このメソッドは、HRESULT を調べ、適切な例外型を生成します。The method looks up the HRESULT and generates the appropriate exception type. たとえば、次のコード フラグメントの HRESULT では、ArgumentException が生成されます。For example, the HRESULT in the following code fragment generates ArgumentException.

CMyClass::MethodThatThrows  
{  
    Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);  
}  

各 HRESULT から .NET Framework の同等の例外クラスへの完全なマッピングを次の表に示します。The following table provides the complete mapping from each HRESULT to its comparable exception class in the .NET Framework.

HRESULTHRESULT .NET の例外.NET exception
MSEE_E_APPDOMAINUNLOADEDMSEE_E_APPDOMAINUNLOADED AppDomainUnloadedExceptionAppDomainUnloadedException
COR_E_APPLICATIONCOR_E_APPLICATION ApplicationExceptionApplicationException
COR_E_ARGUMENT または E_INVALIDARGCOR_E_ARGUMENT or E_INVALIDARG ArgumentExceptionArgumentException
COR_E_ARGUMENTOUTOFRANGECOR_E_ARGUMENTOUTOFRANGE ArgumentOutOfRangeExceptionArgumentOutOfRangeException
COR_E_ARITHMETIC または ERROR_ARITHMETIC_OVERFLOWCOR_E_ARITHMETIC or ERROR_ARITHMETIC_OVERFLOW ArithmeticExceptionArithmeticException
COR_E_ARRAYTYPEMISMATCHCOR_E_ARRAYTYPEMISMATCH ArrayTypeMismatchExceptionArrayTypeMismatchException
COR_E_BADIMAGEFORMAT または ERROR_BAD_FORMATCOR_E_BADIMAGEFORMAT or ERROR_BAD_FORMAT BadImageFormatExceptionBadImageFormatException
COR_E_COMEMULATE_ERRORCOR_E_COMEMULATE_ERROR COMEmulateExceptionCOMEmulateException
COR_E_CONTEXTMARSHALCOR_E_CONTEXTMARSHAL ContextMarshalExceptionContextMarshalException
COR_E_CORECOR_E_CORE CoreExceptionCoreException
NTE_FAILNTE_FAIL CryptographicExceptionCryptographicException
COR_E_DIRECTORYNOTFOUND または ERROR_PATH_NOT_FOUNDCOR_E_DIRECTORYNOTFOUND or ERROR_PATH_NOT_FOUND DirectoryNotFoundExceptionDirectoryNotFoundException
COR_E_DIVIDEBYZEROCOR_E_DIVIDEBYZERO DivideByZeroExceptionDivideByZeroException
COR_E_DUPLICATEWAITOBJECTCOR_E_DUPLICATEWAITOBJECT DuplicateWaitObjectExceptionDuplicateWaitObjectException
COR_E_ENDOFSTREAMCOR_E_ENDOFSTREAM EndOfStreamExceptionEndOfStreamException
COR_E_TYPELOADCOR_E_TYPELOAD EntryPointNotFoundExceptionEntryPointNotFoundException
COR_E_EXCEPTIONCOR_E_EXCEPTION ExceptionException
COR_E_EXECUTIONENGINECOR_E_EXECUTIONENGINE ExecutionEngineExceptionExecutionEngineException
COR_E_FIELDACCESSCOR_E_FIELDACCESS FieldAccessExceptionFieldAccessException
COR_E_FILENOTFOUND または ERROR_FILE_NOT_FOUNDCOR_E_FILENOTFOUND or ERROR_FILE_NOT_FOUND FileNotFoundExceptionFileNotFoundException
COR_E_FORMATCOR_E_FORMAT FormatExceptionFormatException
COR_E_INDEXOUTOFRANGECOR_E_INDEXOUTOFRANGE IndexOutOfRangeExceptionIndexOutOfRangeException
COR_E_INVALIDCAST または E_NOINTERFACECOR_E_INVALIDCAST or E_NOINTERFACE InvalidCastExceptionInvalidCastException
COR_E_INVALIDCOMOBJECTCOR_E_INVALIDCOMOBJECT InvalidComObjectExceptionInvalidComObjectException
COR_E_INVALIDFILTERCRITERIACOR_E_INVALIDFILTERCRITERIA InvalidFilterCriteriaExceptionInvalidFilterCriteriaException
COR_E_INVALIDOLEVARIANTTYPECOR_E_INVALIDOLEVARIANTTYPE InvalidOleVariantTypeExceptionInvalidOleVariantTypeException
COR_E_INVALIDOPERATIONCOR_E_INVALIDOPERATION InvalidOperationExceptionInvalidOperationException
COR_E_IOCOR_E_IO IOExceptionIOException
COR_E_MEMBERACCESSCOR_E_MEMBERACCESS AccessExceptionAccessException
COR_E_METHODACCESSCOR_E_METHODACCESS MethodAccessExceptionMethodAccessException
COR_E_MISSINGFIELDCOR_E_MISSINGFIELD MissingFieldExceptionMissingFieldException
COR_E_MISSINGMANIFESTRESOURCECOR_E_MISSINGMANIFESTRESOURCE MissingManifestResourceExceptionMissingManifestResourceException
COR_E_MISSINGMEMBERCOR_E_MISSINGMEMBER MissingMemberExceptionMissingMemberException
COR_E_MISSINGMETHODCOR_E_MISSINGMETHOD MissingMethodExceptionMissingMethodException
COR_E_MULTICASTNOTSUPPORTEDCOR_E_MULTICASTNOTSUPPORTED MulticastNotSupportedExceptionMulticastNotSupportedException
COR_E_NOTFINITENUMBERCOR_E_NOTFINITENUMBER NotFiniteNumberExceptionNotFiniteNumberException
E_NOTIMPLE_NOTIMPL NotImplementedExceptionNotImplementedException
COR_E_NOTSUPPORTEDCOR_E_NOTSUPPORTED NotSupportedExceptionNotSupportedException
COR_E_NULLREFERENCE または E_POINTERCOR_E_NULLREFERENCE orE_POINTER NullReferenceExceptionNullReferenceException
COR_E_OUTOFMEMORY またはCOR_E_OUTOFMEMORY or

E_OUTOFMEMORYE_OUTOFMEMORY
OutOfMemoryExceptionOutOfMemoryException
COR_E_OVERFLOWCOR_E_OVERFLOW OverflowExceptionOverflowException
COR_E_PATHTOOLONG または ERROR_FILENAME_EXCED_RANGECOR_E_PATHTOOLONG or ERROR_FILENAME_EXCED_RANGE PathTooLongExceptionPathTooLongException
COR_E_RANKCOR_E_RANK RankExceptionRankException
COR_E_REFLECTIONTYPELOADCOR_E_REFLECTIONTYPELOAD ReflectionTypeLoadExceptionReflectionTypeLoadException
COR_E_REMOTINGCOR_E_REMOTING RemotingExceptionRemotingException
COR_E_SAFEARRAYTYPEMISMATCHCOR_E_SAFEARRAYTYPEMISMATCH SafeArrayTypeMismatchExceptionSafeArrayTypeMismatchException
COR_E_SECURITYCOR_E_SECURITY SecurityExceptionSecurityException
COR_E_SERIALIZATIONCOR_E_SERIALIZATION SerializationExceptionSerializationException
COR_E_STACKOVERFLOW または ERROR_STACK_OVERFLOWCOR_E_STACKOVERFLOW orERROR_STACK_OVERFLOW StackOverflowExceptionStackOverflowException
COR_E_SYNCHRONIZATIONLOCKCOR_E_SYNCHRONIZATIONLOCK SynchronizationLockExceptionSynchronizationLockException
COR_E_SYSTEMCOR_E_SYSTEM SystemExceptionSystemException
COR_E_TARGETCOR_E_TARGET TargetExceptionTargetException
COR_E_TARGETINVOCATIONCOR_E_TARGETINVOCATION TargetInvocationExceptionTargetInvocationException
COR_E_TARGETPARAMCOUNTCOR_E_TARGETPARAMCOUNT TargetParameterCountExceptionTargetParameterCountException
COR_E_THREADABORTEDCOR_E_THREADABORTED ThreadAbortExceptionThreadAbortException
COR_E_THREADINTERRUPTEDCOR_E_THREADINTERRUPTED ThreadInterruptedExceptionThreadInterruptedException
COR_E_THREADSTATECOR_E_THREADSTATE ThreadStateExceptionThreadStateException
COR_E_THREADSTOPCOR_E_THREADSTOP ThreadStopExceptionThreadStopException
COR_E_TYPELOADCOR_E_TYPELOAD TypeLoadExceptionTypeLoadException
COR_E_TYPEINITIALIZATIONCOR_E_TYPEINITIALIZATION TypeInitializationExceptionTypeInitializationException
COR_E_VERIFICATIONCOR_E_VERIFICATION VerificationExceptionVerificationException
COR_E_WEAKREFERENCECOR_E_WEAKREFERENCE WeakReferenceExceptionWeakReferenceException
COR_E_VTABLECALLSNOTSUPPORTEDCOR_E_VTABLECALLSNOTSUPPORTED VTableCallsNotSupportedExceptionVTableCallsNotSupportedException
その他のすべての HRESULTAll other HRESULTs COMExceptionCOMException

拡張エラー情報を取得するために、マネージド クライアントは、生成された例外オブジェクトのフィールドを調べる必要があります。To retrieve extended error information, the managed client must examine the fields of the exception object that was generated. 例外オブジェクトでエラーについての有益な情報を提供できるようにするには、COM オブジェクトは、IErrorInfo インターフェイスを実装している必要があります。For the exception object to provide useful information about an error, the COM object must implement the IErrorInfo interface. ランタイムは、IErrorInfo で提供される情報を使用して例外オブジェクトを初期化します。The runtime uses the information provided by IErrorInfo to initialize the exception object.

COM オブジェクトで IErrorInfo がサポートされていない場合、ランタイムは既定値で例外オブジェクトを初期化します。If the COM object does not support IErrorInfo, the runtime initializes an exception object with default values. 次の表で、例外オブジェクトに関連付けられた各フィールドをリストし、COM オブジェクトが IErrorInfo をサポートしている場合の既定の情報ソースを示します。The following table lists each field associated with an exception object and identifies the source of default information when the COM object supports IErrorInfo.

スレッドに IErrorInfo がある場合、ランタイムが HRESULT を無視することがあることに注意してください。Note that the runtime will sometimes ignore an HRESULT in cases where there is an IErrorInfo present on the thread. この動作は、HRESULTIErrorInfo が同じエラーを表していない場合に発生する可能性があります。This behavior can occur in cases where the HRESULT and the IErrorInfo do not represent the same error.

例外フィールドException field COM からの情報のソースSource of Information from COM
ErrorCodeErrorCode 呼び出しから返された HRESULT。HRESULT returned from call.
HelpLinkHelpLink IErrorInfo->HelpContext が 0 以外の場合、文字列は IErrorInfo->GetHelpFile、"#"、および IErrorInfo->GetHelpContext を連結して形成されます。If IErrorInfo->HelpContext is nonzero, the string is formed by concatenating IErrorInfo->GetHelpFile and "#" and IErrorInfo->GetHelpContext. それ以外の場合、文字列は IErrorInfo->GetHelpFile から返されます。Otherwise the string is returned from IErrorInfo->GetHelpFile.
InnerExceptionInnerException 常に null 参照 (Visual Basic では Nothing)。Always a null reference (Nothing in Visual Basic).
メッセージMessage IErrorInfo->GetDescription から返された文字列。String returned from IErrorInfo->GetDescription.
ソースSource IErrorInfo->GetSource から返された文字列。String returned from IErrorInfo->GetSource.
StackTraceStackTrace スタック トレース。The stack trace.
TargetSiteTargetSite 失敗を示す HRESULT を返したメソッドの名前。The name of the method that returned the failing HRESULT.

MessageSource、および StackTrace などの例外フィールドは、StackOverflowException では使用できません。Exception fields, such as Message, Source, and StackTrace are not available for the StackOverflowException.

参照See Also

高度な COM 相互運用性Advanced COM Interoperability
例外Exceptions