Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Os métodos COM reportam erros ao retornar HRESULTs; os métodos .NET reportam-nos através do lançamento de exceções. O runtime trata da transição entre os dois. Cada classe de exceção em .NET mapeia para um HRESULT.
As classes de exceção definidas pelo utilizador podem especificar qualquer HRESULT que seja apropriado. Estas classes de exceção podem alterar dinamicamente o HRESULT para ser devolvido quando a exceção é gerada, ao definir o HResult campo no objeto de exceção. Informação adicional sobre a exceção é fornecida ao cliente através da IErrorInfo interface, que é implementada no objeto .NET no processo não gerido.
Se criares uma classe que estende System.Exception, tens de definir o campo HRESULT durante a construção. Caso contrário, a classe base atribui o valor HRESULT. Pode mapear novas classes de exceção para um HRESULT existente fornecendo o valor no construtor da exceção.
Note que o ambiente de execução, por vezes, ignora um HRESULT nos casos em que existe um IErrorInfo presente no encadeamento. Este comportamento pode ocorrer nos casos em que os HRESULT e os IErrorInfo não representam o mesmo erro.
Criar uma nova classe de exceção e mapeá-la para um HRESULT
Use o código seguinte 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(); }
Pode deparar-se com um programa (em qualquer linguagem de programação) que usa código gerido e não gerido ao mesmo tempo. Por exemplo, o empacotador personalizado no exemplo de código seguinte utiliza o método Marshal.ThrowExceptionForHR(int HResult) para gerar uma exceção com um valor HRESULT específico. O método procura o HRESULT e gera o tipo de exceção apropriado. Por exemplo, o HRESULT no seguinte fragmento de código gera ArgumentException.
CMyClass::MethodThatThrows
{
Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);
}
A tabela seguinte apresenta os mapeamentos comuns do HRESULT para a sua classe de exceção comparável em .NET. Os valores de 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 .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 obter informações detalhadas sobre o erro, o cliente gerido deve examinar os campos do objeto de exceção que foi gerado. Para que o objeto exceção forneça informação útil sobre um erro, o objeto COM deve implementar a IErrorInfo interface. O runtime utiliza a informação fornecida por IErrorInfo para inicializar o objeto de exceção.
Se o objeto COM não suportar IErrorInfo, o runtime inicializa um objeto exceção com valores predefinidos. A tabela seguinte lista cada campo associado a um objeto de exceção e identifica a origem das informações predefinidas quando o objeto COM suporta IErrorInfo.
Note que o ambiente de execução por vezes ignora um HRESULT quando existe um IErrorInfo presente na thread. Este comportamento pode ocorrer nos casos em que os HRESULT e os IErrorInfo não representam o mesmo erro.
| Campo de exceção | Fonte de Informação do COM |
|---|---|
ErrorCode |
O HRESULT respondeu da chamada. |
HelpLink |
Se IErrorInfo->HelpContext não for zero, a cadeia de caracteres é formada pela concatenação de IErrorInfo->GetHelpFile, "#" e IErrorInfo->GetHelpContext. Caso contrário, a string é devolvida por IErrorInfo->GetHelpFile. |
InnerException |
Sempre uma referência nula (Nothingno Visual Basic). |
Message |
Cadeia de caracteres devolvida por IErrorInfo->GetDescription. |
Source |
Cadeia de caracteres devolvida por IErrorInfo->GetSource. |
StackTrace |
O rasto da pilha. |
TargetSite |
O nome do método que devolveu o HRESULT falhado. |
Campos de exceção, como Message, , e Source não estão disponíveis para o StackTraceStackOverflowException.