次の方法で共有


方法: 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 を返したメソッドの名前。

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

参照

その他の技術情報

高度な COM 相互運用性

例外の処理とスロー