Gewusst wie: Zuordnen von HRESULTs und Ausnahmen
Aktualisiert: November 2007
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 |
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.
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. |
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.