Vorgehensweise: Zuordnen von HRESULTs und Ausnahmen

COM-Methoden melden Fehler durch Zurückgeben von HRESULTs; .NET Methoden melden sie durch Auslösen von Ausnahmen. Die Laufzeit steuert den Übergang zwischen beiden. Jede Ausnahmeklasse in .NET ist einem HRESULT zugeordnet.

Benutzerdefinierte Ausnahmeklassen können angeben, welche HRESULT geeignet ist. Diese Ausnahmeklassen können das HRESULT dynamisch ändern, das zurückgegeben wird, wenn die Ausnahme generiert wird, indem das HResult Feld für das Ausnahmeobjekt festgelegt wird. Zusätzliche Informationen zur Ausnahme werden dem Client über die IErrorInfo Schnittstelle bereitgestellt, die für das .NET-Objekt im nicht verwalteten Prozess implementiert wird.

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

Beachten Sie, dass die Laufzeit HRESULT in Fällen manchmal ignoriert, in denen IErrorInfo im Thread vorhanden ist. Dieses Verhalten kann in Fällen auftreten, in denen die HRESULT und die IErrorInfo nicht denselben Fehler darstellen.

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

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

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

Möglicherweise treffen Sie auf ein Programm (in jeder Programmiersprache), das verwalteten und nicht verwalteten Code gleichzeitig verwendet. Beispielsweise verwendet der benutzerdefinierte Marshaller im folgenden Codebeispiel die Marshal.ThrowExceptionForHR(int HResult) Methode, um eine Ausnahme mit einem bestimmten HRESULT-Wert auszuwerfen. Die Methode sucht nach dem HRESULT und generiert den entsprechenden Ausnahmetyp. Zum Beispiel generiert das HRESULT im folgenden Codefragment ArgumentException.

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

Die folgende Tabelle enthält die allgemeinen Zuordnungen von HRESULT zur vergleichbaren Ausnahmeklasse in .NET. HRESULT-Werte ohne explizite Zuordnungen werden zugeordnet COMException. Die vollständige, aktuelle Zuordnung finden Sie im dotnet/runtime-Repository.

HRESULT Ausnahme .NET
COR_E_APPLICATION ApplicationException
COR_E_ARGUMENT oder E_INVALIDARG ArgumentException
COR_E_ARGUMENTOUTOFRANGE ArgumentOutOfRangeException
COR_E_ARITHMETIC or ERROR_ARITHMETIC_OVERFLOW ArithmeticException
COR_E_ARRAYTYPEMISMATCH ArrayTypeMismatchException
COR_E_BADIMAGEFORMAT or ERROR_BAD_FORMAT BadImageFormatException
COR_E_DIRECTORYNOTFOUND or ERROR_PATH_NOT_FOUND DirectoryNotFoundException
COR_E_DIVIDEBYZERO DivideByZeroException
COR_E_DUPLICATEWAITOBJECT DuplicateWaitObjectException
COR_E_ENDOFSTREAM EndOfStreamException
COR_E_ENTRYPOINTNOTFOUND EntryPointNotFoundException
COR_E_EXCEPTION Exception
COR_E_EXECUTIONENGINE ExecutionEngineException
COR_E_FIELDACCESS FieldAccessException
COR_E_FILENOTFOUND or ERROR_FILE_NOT_FOUND FileNotFoundException
COR_E_FORMAT FormatException
COR_E_INDEXOUTOFRANGE IndexOutOfRangeException
COR_E_INVALIDCAST or E_NOINTERFACE InvalidCastException
COR_E_INVALIDFILTERCRITERIA InvalidFilterCriteriaException
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_NOTFINITENUMBER NotFiniteNumberException
E_NOTIMPL NotImplementedException
COR_E_NOTSUPPORTED NotSupportedException
COR_E_NULLREFERENCE orE_POINTER NullReferenceException
COR_E_OUTOFMEMORY or

E_OUTOFMEMORY
OutOfMemoryException
COR_E_OVERFLOW OverflowException
COR_E_PATHTOOLONG or ERROR_FILENAME_EXCED_RANGE PathTooLongException
COR_E_RANK RankException
COR_E_REFLECTIONTYPELOAD ReflectionTypeLoadException
COR_E_SECURITY SecurityException
COR_E_SERIALIZATION SerializationException
COR_E_STACKOVERFLOW orERROR_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_THREADINTERRUPTED ThreadInterruptedException
COR_E_THREADSTATE ThreadStateException
COR_E_TYPELOAD TypeLoadException
COR_E_TYPEINITIALIZATION TypeInitializationException
COR_E_VERIFICATION VerificationException

Um erweiterte Fehlerinformationen abzurufen, muss der verwaltete Client die Felder des generierten Ausnahmeobjekts untersuchen. Damit das Ausnahmeobjekt nützliche Informationen zu einem Fehler bereitstellt, muss das COM-Objekt die IErrorInfo Schnittstelle implementieren. Die Laufzeit verwendet die von IErrorInfo bereitgestellten Informationen, um das Ausnahmeobjekt zu initialisieren.

Wenn das COM-Objekt IErrorInfo nicht unterstützt, initialisiert die Laufzeit ein Ausnahmeobjekt mit Standardwerten. In der folgenden Tabelle werden alle Felder eines Ausnahmeobjekts aufgeführt, und es wird die Herkunft der Standardinformationen angegeben, wenn das COM-Objekt IErrorInfo unterstützt.

Beachten Sie, dass die Laufzeitumgebung ein HRESULT manchmal ignoriert, wenn im Thread ein IErrorInfo vorhanden ist. Dieses Verhalten kann in Fällen auftreten, in denen die HRESULT und die IErrorInfo nicht denselben Fehler darstellen.

Ausnahmefeld Quelle der Informationen von COM
ErrorCode Vom Aufruf zurückgegebener HRESULT
HelpLink Ist IErrorInfo->HelpContext ungleich null, wird die Zeichenfolge durch das Verketten von IErrorInfo->GetHelpFile, "#" und IErrorInfo->GetHelpContext gebildet. Andernfalls wird die Zeichenfolge von IErrorInfo->GetHelpFile zurückgegeben.
InnerException Immer ein Nullverweis (Nothing in Visual Basic).
Message Von IErrorInfo->GetDescription zurückgegebene Zeichenfolge.
Source Von IErrorInfo->GetSource zurückgegebene Zeichenfolge.
StackTrace Die Stapelablaufverfolgung.
TargetSite Der Name der Methode, die das fehlerhafte HRESULT zurückgegeben hat.

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

Siehe auch