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

Outros recursos

Interoperabilidade de COM avançadas