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.