Gewusst wie: Zuordnen von HRESULTs und Ausnahmen

COM-Methoden melden Fehler durch die Rückgabe von HRESULTs, .NET-Methoden dagegen durch das Auslösen von Ausnahmen. Common Language Runtime verwaltet den Übergang zwischen beiden. Jede Ausnahmeklasse in .NET Framework wird einem HRESULT zugeordnet.

Durch benutzerdefinierte Ausnahmeklassen kann festgelegt werden, welches HRESULT angemessen ist. Durch diese Ausnahmeklassen kann das HRESULT dynamisch geändert werden, das beim Generieren einer Ausnahme zurückgegeben werden soll, indem das HResult-Feld auf das Ausnahmeobjekt eingestellt wird. Zusätzliche Informationen über die Ausnahme werden dem Client über die Schnittstelle IErrorInfo bereitgestellt, die auf dem .NET-Objekt im nicht verwalteten Prozess implementiert ist.

Wenn Sie eine Klasse erstellen, die System.Exception erweitert, müssen Sie das HRESULT-Feld während der Konstruktion festlegen. Ansonsten weist die Basisklasse den HRESULT-Wert zu. Sie können neue Ausnahmeklassen einem vorhandenen HRESULT zuordnen, indem Sie den Wert im Konstruktor der Ausnahme angeben.

Beachten Sie, dass HRESULT von der Laufzeit zeitweise ignoriert werden kann, wenn der Thread IErrorInfo enthält. Dieses Verhalten kann auftreten, wenn HRESULT und IErrorInfo nicht denselben Fehler darstellen.

So erstellen Sie eine neue Ausnahmeklasse und ordnen diese einem HRESULT zu

  • Verwenden Sie den folgenden Code, um eine neue Ausnahmeklasse mit dem Namen NoAccessException zu erstellen und diese dem HRESULT E_ACCESSDENIED zuzuordnen.

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

Es kann vorkommen, dass ein Programm (in einer beliebigen Programmiersprache) gleichzeitig verwalteten und nicht verwalteten Code verwendet. So verwendet z. B. der benutzerdefinierte Marshaller im folgenden Codebeispiel die Marshal.ThrowExceptionForHR(int HResult)-Methode, um eine Ausnahme mit einem spezifischen HRESULT-Wert auszulösen. Die Methode sucht nach dem HRESULT und generiert den entsprechenden Ausnahmetyp. Im folgenden Codefragment wird z. B. ArgumentException generiert.

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

In der folgenden Tabelle wird eine vollständige Zuordnung eines jeden HRESULT zur vergleichbaren Ausnahmeklasse in .NET Framework angegeben.

HRESULT

.NET-Ausnahme

MSEE_E_APPDOMAINUNLOADED

AppDomainUnloadedException

COR_E_APPLICATION

ApplicationException

COR_E_ARGUMENT oder E_INVALIDARG

ArgumentException

COR_E_ARGUMENTOUTOFRANGE

ArgumentOutOfRangeException

COR_E_ARITHMETIC oder ERROR_ARITHMETIC_OVERFLOW

ArithmeticException

COR_E_ARRAYTYPEMISMATCH

ArrayTypeMismatchException

COR_E_BADIMAGEFORMAT oder ERROR_BAD_FORMAT

BadImageFormatException

COR_E_COMEMULATE_ERROR

COMEmulateException

COR_E_CONTEXTMARSHAL

ContextMarshalException

COR_E_CORE

CoreException

NTE_FAIL

CryptographicException

COR_E_DIRECTORYNOTFOUND oder ERROR_PATH_NOT_FOUND

DirectoryNotFoundException

COR_E_DIVIDEBYZERO

DivideByZeroException

COR_E_DUPLICATEWAITOBJECT

DuplicateWaitObjectException

COR_E_ENDOFSTREAM

EndOfStreamException

COR_E_TYPELOAD

EntryPointNotFoundException

COR_E_EXCEPTION

Ausnahme

COR_E_EXECUTIONENGINE

ExecutionEngineException

COR_E_FIELDACCESS

FieldAccessException

COR_E_FILENOTFOUND oder ERROR_FILE_NOT_FOUND

FileNotFoundException

COR_E_FORMAT

FormatException

COR_E_INDEXOUTOFRANGE

IndexOutOfRangeException

COR_E_INVALIDCAST oder 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 oder E_POINTER

NullReferenceException

COR_E_OUTOFMEMORY oder

E_OUTOFMEMORY

OutOfMemoryException

COR_E_OVERFLOW

OverflowException

COR_E_PATHTOOLONG oder 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 oder 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

Alle anderen HRESULTs

COMException

Um erweiterte Fehlerinformationen abzurufen, muss der verwaltete Client die Felder des generierten Ausnahmeobjekts untersuchen. Damit das Ausnahmeobjekt nützliche Fehlerinformationen bereitstellen kann, muss die Schnittstelle IErrorInfo durch das COM-Objekt implementiert werden. Die von IErrorInfo bereitgestellte Information wird von der Laufzeit zur Initialisierung des Ausnahmeobjekts verwendet.

Wenn das COM-Objekt IErrorInfo nicht unterstützt, wird durch Common Language Runtime ein Ausnahmeobjekt mit Standardwerten initialisiert. In der folgenden Tabelle wird jedes Feld aufgeführt, das einem Ausnahmeobjekt zugeordnet ist, und die Standardinformationsquelle angegeben, wenn das COM-Objekt IErrorInfo unterstützt.

Beachten Sie, dass HRESULT von der Laufzeit zeitweise ignoriert werden kann, wenn der Thread IErrorInfo enthält. Dieses Verhalten kann auftreten, wenn HRESULT und IErrorInfo nicht denselben Fehler darstellen.

Ausnahmefeld

Informationsquelle von COM

ErrorCode

Vom Aufruf zurückgegebenes HRESULT.

HelpLink

Wenn IErrorInfo->HelpContext nicht 0 ist, wird die Zeichenfolge durch Verkettung von IErrorInfo->GetHelpFile und "#" und IErrorInfo->GetHelpContext geformt. Andernfalls wird die Zeichenfolge von IErrorInfo->GetHelpFile zurückgegeben.

InnerException

Immer ein NULL-Verweis (Nothing in Visual Basic).

Message

Von IErrorInfo->GetDescription zurückgegebene Zeichenfolge.

Quelle

Von IErrorInfo->GetSource zurückgegebene Zeichenfolge.

StackTrace

Die Stapelüberwachung.

TargetSite

Name der Methode, die das fehlgeschlagene HRESULT zurückgegeben hat.

Ausnahmefelder wie Message, Source und StackTrace sind für StackOverflowException nicht verfügbar.

Siehe auch

Weitere Ressourcen

Erweiterte COM-Interoperabilität

Behandeln und Auslösen von Ausnahmen