Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Verwenden Sie den folgenden Code, um eine neue Ausnahmeklasse mit dem Namen
NoAccessExceptionzu erstellen und sie dem HRESULTE_ACCESSDENIEDzuzuordnen.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 orE_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.