Compartilhar via


Como: MAP HRESULTs and Exceptions

Métodos COM relatar erros, retornando HRESULTs; métodos .NET relatá-los por gerar exceções.O tempo de execução manipula a transição entre os dois.Cada classe de exceção do .NET estrutura mapeia para um HRESULT.

Classes de exceção definido pelo usuário podem especificar que 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.São fornecidas informações adicionais sobre a exceção para o cliente através de IErrorInfo interface, que é implementada no objeto do .NET no processo não gerenciado.

Se você criar uma classe que estende sistema.exceção, você deve conjunto o campo HRESULT durante a construção.Caso contrário, a classe base atribui o valor HRESULT.Você pode MAP novas classes de exceção para um HRESULT existente, fornecendo o valor no construtor da exceção.

Observe que o tempo de execução irá ignorar algumas vezes um 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 MAP-lo para um HRESULT

  • Use o código a seguir para criar uma nova classe de exceção chamada 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 código gerenciado e ao mesmo time.Por exemplo, o empacotador personalizado no exemplo de código a seguir usa o realizar marshaling.ThrowExceptionForHR (int HResult) método lançar 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 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 no .NET estrutura.

HRESULT

Exceção .NET

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

COR_E_NULLREFERENCE orE_POINTER

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

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_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 foi gerada.Para o objeto de exceção fornecer informações úteis sobre um erro, o objeto COM deve implementar o IErrorInfo interface.O tempo de execução usa as informações fornecidas por IErrorInfo para inicializar o objeto de exceção.

Se o objeto COM não oferece suporte a IErrorInfo, o tempo de execução 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 dá suporte a IErrorInfo.

Observe que o tempo de execução irá ignorar algumas vezes um 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 telefonar.

HelpLink

If IErrorInfo-> HelpContext é diferente de zero, a seqüência de caracteres é formada pela concatenação IErrorInfo-> GetHelpFile e "#" e IErrorInfo-> GetHelpContext.Caso contrário, será retornada a seqüência de caracteres de IErrorInfo-> GetHelpFile.

InnerException

Sempre uma referência nula (Nada no Visual Basic).

Message (Mensagem)

Seqüência de caracteres retornada da IErrorInfo-> GetDescription.

Origem

Seqüência de caracteres retornada da IErrorInfo-> GetSource.

StackTrace

O rastreamento da pilha.

TargetSite

O nome do método que retornou a que apresenta falha HRESULT.

Campos de exceção, sistema autônomo Mensagem, fonte, and StackTrace não estão disponível para o StackOverflowException.

Consulte também

Outros recursos

Interoperabilidade COM avançada

Tratamento e lançamento de exceções