Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os métodos COM relatam erros retornando HRESULTs; .NET métodos os relatam lançando exceções. O runtime manipula a transição entre os dois. Cada classe de exceção em .NET mapeia para um HRESULT.
As classes de exceção definidas pelo usuário podem especificar qualquer HRESULT apropriado. Essas classes de exceção podem alterar dinamicamente o HRESULT a ser retornado quando a exceção é gerada definindo o HResult campo no objeto de exceção. Informações adicionais sobre a exceção são fornecidas ao cliente por meio da IErrorInfo interface, que é implementada no objeto .NET no processo não gerenciado.
Se você criar uma classe derivada de System.Exception, deverá definir o campo HRESULT durante a construção da classe. Caso contrário, a classe base atribuirá o valor HRESULT. Você pode mapear novas classes de exceção para um HRESULT existente fornecendo o valor no construtor da exceção.
Observe que o runtime às vezes ignora um HRESULT nos casos em que há um IErrorInfo presente na thread. Esse comportamento pode ocorrer em casos em que o HRESULT e o IErrorInfo não representam o mesmo erro.
Para criar uma nova classe de exceção e mapeá-la para um HRESULT
Use o código a seguir para criar uma nova classe de exceção chamada
NoAccessExceptione mapeá-la para o HRESULTE_ACCESSDENIED.Class NoAccessException : public ApplicationException { NoAccessException () { HResult = E_ACCESSDENIED; } } CMyClass::MethodThatThrows { throw new NoAccessException(); }
Você pode encontrar um programa (em qualquer linguagem de programação) que usa código gerenciado e não gerenciado ao mesmo tempo. Por exemplo, o marshaller personalizado no exemplo de código a seguir usa o Marshal.ThrowExceptionForHR(int HResult) método para gerar uma exceção com um valor HRESULT específico. O método pesquisa o HRESULT e gera o tipo de exceção apropriado. Por exemplo, o HRESULT no fragmento de código a seguir gera ArgumentException.
CMyClass::MethodThatThrows
{
Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);
}
A tabela a seguir fornece os mapeamentos comuns de HRESULT para sua classe de exceção comparável em .NET. Valores HRESULT sem mapeamentos explícitos são mapeados para COMException. O mapeamento completo e atualizado pode ser encontrado no repositório dotnet/runtime.
| HRESULT | exceção do .NET |
|---|---|
COR_E_APPLICATION |
ApplicationException |
COR_E_ARGUMENT ou 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 |
Para recuperar informações de erro estendidas, o cliente gerenciado deve examinar os campos do objeto de exceção que foi gerado. Para que o objeto de exceção forneça informações úteis sobre um erro, o objeto COM deve implementar a IErrorInfo interface. O runtime usa as informações fornecidas IErrorInfo para inicializar o objeto de exceção.
Se o objeto COM não der suporte IErrorInfo, o runtime inicializará um objeto de exceção com valores padrão. A tabela a seguir lista cada campo associado a um objeto de exceção e identifica a origem das informações padrão quando o objeto COM é compatível IErrorInfo.
Observe que o runtime às vezes ignorará um HRESULT nos casos em que houver um IErrorInfo presente na thread. Esse comportamento pode ocorrer em casos em que o HRESULT e o IErrorInfo não representam o mesmo erro.
| Campo de exceção | Fonte de informações do COM |
|---|---|
ErrorCode |
HRESULT retornado da chamada. |
HelpLink |
Se IErrorInfo->HelpContext não for zero, a cadeia de caracteres será formada por concatenação IErrorInfo->GetHelpFile e "#" e IErrorInfo->GetHelpContext. Caso contrário, a cadeia de caracteres será retornada de IErrorInfo->GetHelpFile. |
InnerException |
Sempre uma referência nula (Nothing em Visual Basic). |
Message |
Cadeia de caracteres retornada de IErrorInfo->GetDescription. |
Source |
Cadeia de caracteres retornada de IErrorInfo->GetSource. |
StackTrace |
O rastreamento de pilha. |
TargetSite |
O nome do método que retornou o HRESULT com falha. |
Campos de exceção, como Message, Sourcee StackTrace não estão disponíveis para .StackOverflowException