Delen via


Procedure: HRESULT's en uitzonderingen toewijzen

COM-methoden rapporteren fouten door HRESULTs te retourneren; .NET-methoden rapporteren ze door uitzonderingen te genereren. De runtime verwerkt de overgang tussen de twee. Elke uitzonderingsklasse in .NET Framework wordt toegewezen aan een HRESULT.

Door de gebruiker gedefinieerde uitzonderingsklassen kunnen opgeven wat HRESULT geschikt is. Deze uitzonderingsklassen kunnen het HRESULT dynamisch wijzigen dat moet worden geretourneerd wanneer de uitzondering wordt gegenereerd door het HResult veld in te stellen op het uitzonderingsobject. Aanvullende informatie over de uitzondering wordt aan de client verstrekt via de IErrorInfo interface, die wordt geïmplementeerd op het .NET-object in het onbeheerde proces.

Als u een klasse maakt die uitbreidt System.Exception, moet u het veld HRESULT instellen tijdens de bouw. Anders wijst de basisklasse de HRESULT-waarde toe. U kunt nieuwe uitzonderingsklassen toewijzen aan een bestaand HRESULT door de waarde in de constructor van de uitzondering op te geven.

Houd er rekening mee dat de runtime soms een HRESULT fout negeert in gevallen waarin de thread aanwezig IErrorInfo is. Dit gedrag kan optreden in gevallen waarin de HRESULT en de IErrorInfo fout niet dezelfde fout vertegenwoordigen.

Een nieuwe uitzonderingsklasse maken en toewijzen aan een HRESULT

  1. Gebruik de volgende code om een nieuwe uitzonderingsklasse te maken die wordt aangeroepen NoAccessException en toe te wijzen aan HRESULT E_ACCESSDENIED.

    Class NoAccessException : public ApplicationException
    {
        NoAccessException () {
        HResult = E_ACCESSDENIED;
    }
    }
    CMyClass::MethodThatThrows
    {
    throw new NoAccessException();
    }
    

U kunt een programma (in elke programmeertaal) tegenkomen dat tegelijkertijd beheerde en onbeheerde code gebruikt. De aangepaste marshaller in het volgende codevoorbeeld gebruikt bijvoorbeeld de Marshal.ThrowExceptionForHR(int HResult) methode om een uitzondering met een specifieke HRESULT-waarde te genereren. De methode zoekt het HRESULT op en genereert het juiste uitzonderingstype. Het HRESULT in het volgende codefragment genereert ArgumentExceptionbijvoorbeeld .

CMyClass::MethodThatThrows
{
    Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);
}

De volgende tabel bevat de algemene toewijzingen van HRESULT aan de vergelijkbare uitzonderingsklasse in .NET. HRESULT-waarden zonder expliciete toewijzingen worden toegewezen aan COMException. De volledige up-to-date toewijzing vindt u in de dotnet/runtime-opslagplaats.

HRESULT .NET-uitzondering
COR_E_APPLICATION ApplicationException
COR_E_ARGUMENT of 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

Voor het ophalen van uitgebreide foutinformatie moet de beheerde client de velden van het gegenereerde uitzonderingsobject onderzoeken. Om het uitzonderingsobject nuttige informatie te geven over een fout, moet het COM-object de IErrorInfo interface implementeren. De runtime gebruikt de informatie die wordt verstrekt om IErrorInfo het uitzonderingsobject te initialiseren.

Als het COM-object geen ondersteuning biedt IErrorInfo, initialiseert de runtime een uitzonderingsobject met standaardwaarden. De volgende tabel bevat elk veld dat is gekoppeld aan een uitzonderingsobject en identificeert de bron van standaardinformatie wanneer het COM-object ondersteuning biedt IErrorInfo.

Houd er rekening mee dat de runtime soms een HRESULT fout negeert in gevallen waarin de thread aanwezig IErrorInfo is. Dit gedrag kan optreden in gevallen waarin de HRESULT en de IErrorInfo fout niet dezelfde fout vertegenwoordigen.

Uitzonderingsveld Bron van informatie van COM
ErrorCode HRESULT geretourneerd vanuit gesprek.
HelpLink Als IErrorInfo->HelpContext het niet-nul is, wordt de tekenreeks gevormd door samenvoeging IErrorInfo->GetHelpFile en "#" en IErrorInfo->GetHelpContext. Anders wordt de tekenreeks geretourneerd van IErrorInfo->GetHelpFile.
InnerException Altijd een null-verwijzing (Nothing in Visual Basic).
Message Tekenreeks geretourneerd van IErrorInfo->GetDescription.
Source Tekenreeks geretourneerd van IErrorInfo->GetSource.
StackTrace De stacktracering.
TargetSite De naam van de methode die het mislukte HRESULT heeft geretourneerd.

Uitzonderingsvelden, zoals Message, Sourceen StackTrace zijn niet beschikbaar voor de StackOverflowException.

Zie ook