Como: Map HRESULTs and Exceptions
Métodos COM relatam erros, retornando HRESULTs; .NET métodos relatá-los Lançando exceções. O runtime lida com a transição entre os dois. Cada classe de exceção na.NET Framework mapeia para um HRESULT.
Classes de exceção definido pelo usuário podem especificar que HRESULT for mais apropriado. Essas classes de exceção podem alterar dinamicamente o HRESULT a ser retornada quando a exceção é gerada, definindo a HResult campo do objeto de exceção. Informações adicionais sobre a exceção são fornecidas para o cliente através de IErrorInfo interface, que é implementada na.NET object no processo não gerenciado.
Se você criar uma classe que estende System. Exception, você deve definir o campo HRESULT durante a construção. Caso contrário, a classe base atribui o valor HRESULT. Você pode mapear as novas classes de exceção para um HRESULT existente fornecendo o valor no construtor da exceção.
Observe que o tempo de execução, às vezes, irá ignorar uma HRESULT em casos onde há um IErrorInfo presente no segmento. Esse comportamento pode ocorrer em casos onde o HRESULT e o IErrorInfo não representam o mesmo erro.
Para criar uma nova classe de exceção e mapeá-lo para um HRESULT.
Use o seguinte código para criar uma nova classe de exceção chamado NoAccessException e mapeá-lo para o HRESULT E_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 tanto código gerenciado e ao mesmo tempo. Por exemplo, o empacotador personalizado no exemplo de código a seguir usa a Marshal.ThrowExceptionForHR (int HResult) método para lançar uma exceção com um valor específico de HRESULT. O método procura 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 o mapeamento completo de cada HRESULT à sua classe de exceção comparável na.NET Framework.
HRESULT |
.NET exceção |
---|---|
MSEE_E_APPDOMAINUNLOADED |
AppDomainUnloadedException |
COR_E_APPLICATION |
ApplicationException |
COR_E_ARGUMENT ou E_INVALIDARG |
ArgumentException |
COR_E_ARGUMENTOUTOFRANGE |
ArgumentOutOfRangeException |
COR_E_ARITHMETIC ou ERROR_ARITHMETIC_OVERFLOW |
ArithmeticException |
COR_E_ARRAYTYPEMISMATCH |
ArrayTypeMismatchException |
COR_E_BADIMAGEFORMAT ou ERROR_BAD_FORMAT |
BadImageFormatException |
COR_E_COMEMULATE_ERROR |
COMEmulateException |
COR_E_CONTEXTMARSHAL |
ContextMarshalException |
COR_E_CORE |
CoreException |
NTE_FAIL |
CryptographicException |
COR_E_DIRECTORYNOTFOUND ou ERROR_PATH_NOT_FOUND |
DirectoryNotFoundException |
COR_E_DIVIDEBYZERO |
DivideByZeroException |
COR_E_DUPLICATEWAITOBJECT |
DuplicateWaitObjectException |
COR_E_ENDOFSTREAM |
EndOfStreamException |
COR_E_TYPELOAD |
EntryPointNotFoundException |
COR_E_EXCEPTION |
Exceção |
COR_E_EXECUTIONENGINE |
ExecutionEngineException |
COR_E_FIELDACCESS |
FieldAccessException |
COR_E_FILENOTFOUND ou ERROR_FILE_NOT_FOUND |
FileNotFoundException |
COR_E_FORMAT |
FormatException |
COR_E_INDEXOUTOFRANGE |
IndexOutOfRangeException |
COR_E_INVALIDCAST ou E_NOINTERFACE |
InvalidCastException |
COR_E_INVALIDCOMOBJECT |
InvalidComObjectException |
COR_E_INVALIDFILTERCRITERIA |
InvalidFilterCriteriaException |
COR_E_INVALIDOLEVARIANTTYPE |
InvalidOleVariantTypeException |
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_MULTICASTNOTSUPPORTED |
MulticastNotSupportedException |
COR_E_NOTFINITENUMBER |
NotFiniteNumberException |
E_NOTIMPL |
NotImplementedException |
COR_E_NOTSUPPORTED |
NotSupportedException |
OrE_POINTER COR_E_NULLREFERENCE |
NullReferenceException |
COR_E_OUTOFMEMORY ou E_OUTOFMEMORY |
OutOfMemoryException |
COR_E_OVERFLOW |
OverflowException |
COR_E_PATHTOOLONG ou ERROR_FILENAME_EXCED_RANGE |
PathTooLongException |
COR_E_RANK |
RankException |
COR_E_REFLECTIONTYPELOAD |
ReflectionTypeLoadException |
COR_E_REMOTING |
RemotingException |
COR_E_SAFEARRAYTYPEMISMATCH |
SafeArrayTypeMismatchException |
COR_E_SECURITY |
SecurityException |
COR_E_SERIALIZATION |
SerializationException |
OrERROR_STACK_OVERFLOW COR_E_STACKOVERFLOW |
StackOverflowException |
COR_E_SYNCHRONIZATIONLOCK |
SynchronizationLockException |
COR_E_SYSTEM |
SystemException |
COR_E_TARGET |
TargetException |
COR_E_TARGETINVOCATION |
TargetInvocationException |
COR_E_TARGETPARAMCOUNT |
TargetParameterCountException |
COR_E_THREADABORTED |
ThreadAbortException |
COR_E_THREADINTERRUPTED |
ThreadInterruptedException |
COR_E_THREADSTATE |
ThreadStateException |
COR_E_THREADSTOP |
ThreadStopException |
COR_E_TYPELOAD |
TypeLoadException |
COR_E_TYPEINITIALIZATION |
TypeInitializationException |
COR_E_VERIFICATION |
VerificationException |
COR_E_WEAKREFERENCE |
WeakReferenceException |
COR_E_VTABLECALLSNOTSUPPORTED |
VTableCallsNotSupportedException |
Todos os outros HRESULTs. |
COMException |
Para recuperar informações de erro estendidas, o cliente gerenciado deve examinar os campos do objeto de exceção que foi gerado. Para o objeto de exceção fornecer informações úteis sobre um erro, o objeto COM deve implementar a IErrorInfo interface. O runtime usa as informações fornecidas por IErrorInfo para inicializar o objeto de exceção.
Se o objeto COM não suporta IErrorInfo, o runtime inicializa 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 fonte de informações padrão, quando o objeto COM suporta IErrorInfo.
Observe que o tempo de execução, às vezes, irá ignorar uma HRESULT em casos onde há um IErrorInfo presente no segmento. Esse comportamento pode ocorrer em casos onde o HRESULT e o IErrorInfo não representam o mesmo erro.
Campo de exceção |
Fonte de informações do COM |
---|---|
ErrorCode |
HRESULT retornado de chamada. |
HelpLink |
Se IErrorInfo - > HelpContext é diferente de zero, a seqüência de caracteres é formada pela concatenação IErrorInfo - > GetHelpFile e "#" e IErrorInfo - > GetHelpContext. Caso contrário, a seqüência de caracteres é retornada de IErrorInfo - > GetHelpFile. |
InnerException |
Sempre é uma referência nula (nada em Visual Basic). |
Message (Mensagem) |
Seqüência de caracteres retornada da IErrorInfo - > GetDescription. |
Origem |
Seqüência de caracteres retornada da IErrorInfo - > GetSource. |
StackTrace |
O rastreamento de pilha. |
TargetSite |
O nome do método que retornou a falha HRESULT. |
Campos de exceção, como mensagem, fonte, e StackTrace não estão disponíveis para o StackOverflowException.
Consulte também
Conceitos
Tratamento e lançamento de exceções