Postupy: Mapování výsledků HRESULT a výjimek

Metody MODELU COM hlásí chyby vrácením HRESULTs; metody .NET je hlásí vyvoláním výjimek. Modul runtime zpracovává přechod mezi těmito dvěma moduly. Každá třída výjimky v rozhraní .NET Framework se mapuje na HRESULT.

Třídy výjimek definované uživatelem mohou určit, co je vhodné HRESULT. Tyto třídy výjimek mohou dynamicky změnit HRESULT, aby bylo vráceno, když je výjimka generována nastavením HResult pole na objektu výjimky. Další informace o výjimce jsou poskytovány klientovi prostřednictvím IErrorInfo rozhraní, které je implementováno v objektu .NET v nespravovaném procesu.

Pokud vytvoříte třídu, která rozšiřuje System.Exception, je nutné nastavit POLE HRESULT během sestavování. V opačném případě základní třída přiřadí hodnotu HRESULT. Nové třídy výjimek můžete mapovat na existující HRESULT zadáním hodnoty v konstruktoru výjimky.

Mějte na paměti, že modul runtime někdy ignoruje HRESULT v případech, kdy je IErrorInfo ve vlákně k dispozici. K tomuto chování může dojít v případech, kdy HRESULT a IErrorInfo nereprezentují stejnou chybu.

Vytvoření nové třídy výjimky a jeho mapování na HRESULT

  1. Pomocí následujícího kódu vytvořte novou třídu výjimky s názvem NoAccessException a namapujte ji na HRESULT E_ACCESSDENIED.

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

Můžete narazit na program (v libovolném programovacím jazyce), který současně používá spravovaný i nespravovaný kód. Například vlastní marshaller v následujícím příkladu kódu používá metodu Marshal.ThrowExceptionForHR(int HResult) k vyvolání výjimky s konkrétní hodnotou HRESULT. Metoda vyhledá HRESULT a vygeneruje odpovídající typ výjimky. Například HRESULT v následujícím fragmentu kódu generuje ArgumentException.

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

Následující tabulka obsahuje běžná mapování z HRESULT na svoji srovnatelnou třídu výjimek v .NET. Hodnoty HRESULT bez explicitních mapování jsou mapovány na COMException. Kompletní aktuální mapování najdete v úložišti dotnet/runtime.

HRESULT Výjimka .NET
COR_E_APPLICATION ApplicationException
COR_E_ARGUMENT nebo 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

Aby bylo možné načíst rozšířené informace o chybách, musí spravovaný klient prozkoumat pole vygenerovaného objektu výjimky. Aby objekt výjimky poskytoval užitečné informace o chybě, musí objekt COM implementovat IErrorInfo rozhraní. Modul runtime používá informace poskytnuté IErrorInfo k inicializaci objektu výjimky.

Pokud objekt COM nepodporuje IErrorInfo, modul runtime inicializuje objekt výjimky s výchozími hodnotami. Následující tabulka uvádí každé pole přidružené k objektu výjimky a identifikuje zdroj výchozích informací, pokud objekt COM podporuje IErrorInfo.

Mějte na paměti, že modul runtime někdy ignoruje HRESULT v případech, kdy je IErrorInfo ve vlákně k dispozici. K tomuto chování může dojít v případech, kdy HRESULT a IErrorInfo nereprezentují stejnou chybu.

Pole výjimky Zdroj informací z modelu COM
ErrorCode Funkce HRESULT se vrátila z volání.
HelpLink Pokud IErrorInfo->HelpContext je nenulový, řetězec se vytvoří zřetězením IErrorInfo->GetHelpFile a "#" a IErrorInfo->GetHelpContext. V opačném případě se řetězec vrátí z IErrorInfo->GetHelpFile.
InnerException Vždy nulový odkaz (Nothing v jazyce Visual Basic).
Message Řetězec vrácený z IErrorInfo->GetDescription.
Source Řetězec vrácený z IErrorInfo->GetSource.
StackTrace Trasování zásobníku.
TargetSite Název metody, která vrátila selhání HRESULT.

Pole výjimek, například Message, Sourcea StackTrace nejsou k dispozici pro StackOverflowException

Viz také