Anvisningar: Mappa HRESULT och undantag
COM-metoder rapporterar fel genom att returnera HRESULT: .NET-metoder rapporterar dem genom att utlösa undantag. Körningen hanterar övergången mellan de två. Varje undantagsklass i .NET Framework mappar till en HRESULT.
Användardefinierade undantagsklasser kan ange vad HRESULT är lämpligt. Dessa undantagsklasser kan dynamiskt ändra HRESULT som ska returneras när undantaget genereras genom att ange HResult
fältet på undantagsobjektet. Ytterligare information om undantaget ges till klienten via IErrorInfo
gränssnittet, som implementeras på .NET-objektet i den ohanterade processen.
Om du skapar en klass som utökar System.Exception
måste du ange HRESULT-fältet under konstruktionen. Annars tilldelar basklassen HRESULT-värdet. Du kan mappa nya undantagsklasser till en befintlig HRESULT genom att ange värdet i undantagets konstruktor.
Observera att körningen ibland ignorerar en HRESULT
i de fall där det finns en IErrorInfo
present i tråden. Det här beteendet kan inträffa i fall där HRESULT
och IErrorInfo
inte representerar samma fel.
Skapa en ny undantagsklass och mappa den till en HRESULT
Använd följande kod för att skapa en ny undantagsklass med namnet
NoAccessException
och mappa den till HRESULTE_ACCESSDENIED
.Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows { throw new NoAccessException(); }
Du kan stöta på ett program (på valfritt programmeringsspråk) som använder både hanterad och ohanterad kod samtidigt. Till exempel använder Marshal.ThrowExceptionForHR(int HResult)
den anpassade marshallern i följande kodexempel metoden för att utlösa ett undantag med ett specifikt HRESULT-värde. Metoden söker efter HRESULT och genererar lämplig undantagstyp. HRESULT i följande kodfragment genererar ArgumentException
till exempel .
CMyClass::MethodThatThrows
{
Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);
}
Följande tabell innehåller vanliga mappningar från HRESULT till dess jämförbara undantagsklass i .NET. HRESULT-värden utan explicita mappningar mappas till COMException
. Den fullständiga uppdaterade mappningen finns på dotnet/runtime-lagringsplatsen.
HRESULT | .NET-undantag |
---|---|
COR_E_APPLICATION |
ApplicationException |
COR_E_ARGUMENT eller 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 |
För att hämta utökad felinformation måste den hanterade klienten undersöka fälten i undantagsobjektet som genererades. För att undantagsobjektet ska kunna ge användbar information om ett fel måste COM-objektet implementera IErrorInfo
gränssnittet. Körningen använder den information som tillhandahålls av IErrorInfo
för att initiera undantagsobjektet.
Om COM-objektet inte stöder IErrorInfo
initierar körningen ett undantagsobjekt med standardvärden. I följande tabell visas varje fält som är associerat med ett undantagsobjekt och som identifierar källan till standardinformationen när COM-objektet stöder IErrorInfo
.
Observera att körningen ibland ignorerar en HRESULT
i de fall där det finns en IErrorInfo
present i tråden. Det här beteendet kan inträffa i fall där HRESULT
och IErrorInfo
inte representerar samma fel.
Undantagsfält | Informationskälla från COM |
---|---|
ErrorCode |
HRESULT returnerade från anropet. |
HelpLink |
Om IErrorInfo->HelpContext är nonzero bildas strängen genom sammanfogning IErrorInfo->GetHelpFile och "#" och IErrorInfo->GetHelpContext . Annars returneras strängen från IErrorInfo->GetHelpFile . |
InnerException |
Alltid en null-referens (Nothing i Visual Basic). |
Message |
Sträng som returneras från IErrorInfo->GetDescription . |
Source |
Sträng som returneras från IErrorInfo->GetSource . |
StackTrace |
Stackspårningen. |
TargetSite |
Namnet på den metod som returnerade den misslyckade HRESULT. |
Undantagsfält, till exempel Message
, Source
och StackTrace
är inte tillgängliga för StackOverflowException
.