Dela via


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.Exceptionmå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

  1. Använd följande kod för att skapa en ny undantagsklass med namnet NoAccessException och mappa den till HRESULT E_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 ArgumentExceptiontill 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 IErrorInfoinitierar 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, Sourceoch StackTrace är inte tillgängliga för StackOverflowException.

Se även