Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Metody rozhraní COM hlásí chyby vrácením hodnoty HRESULT; metody rozhraní .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ýjimek v .NET se mapuje na HRESULT.
Uživatelem definované třídy výjimek mohou určit libovolný vhodný kód HRESULT. Tyto třídy výjimek mohou dynamicky změnit HRESULT, který se má vrátit při vyvolání výjimky, nastavením pole HResult v 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 runtime někdy ignoruje HRESULT v případech, kdy je ve vlákně přítomen IErrorInfo. 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
Pomocí následujícího kódu vytvořte novou třídu výjimky s názvem
NoAccessExceptiona namapujte ji na HRESULTE_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 objekt pro marshaling v následujícím příkladu kódu používá metodu Marshal.ThrowExceptionForHR(int HResult) k vyvolání výjimky s určitou 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 orE_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.
Všimněte si, že runtime někdy ignoruje HRESULT, pokud je ve vlákně přítomen IErrorInfo. K tomuto chování může dojít v případech, kdy HRESULT a IErrorInfo nereprezentují stejnou chybu.
| Pole výjimky | Zdroj informací z 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 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 chybový kód HRESULT. |
Pole výjimek, například Message, Sourcea StackTrace nejsou k dispozici pro StackOverflowException