Freigeben über


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. Im folgenden Beispiel wird eine neue Ausnahmeklasse erstellt, die NoAccessException genannt wird. Diese wird dann dem HRESULT E_ACCESSDENIED zugeordnet:

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 Exception
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.

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.
Source 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

Erweitertes COM-Interop | Behandeln und Auslösen von Ausnahmen