Практическое руководство. Сопоставление значений HRESULT и исключений

COM-методы сообщают об ошибках, возвращая значения HRESULT. Методы .NET сообщают об ошибках путем создания исключений. Среда выполнения осуществляет перевод значений HRESULT в исключения и наоборот. Каждому классу исключений в .NET Framework соответствует значение HRESULT.

В определенных пользователем классах исключений могут указываться любые подходящие значения HRESULT. Эти классы исключений могут динамически изменять значения HRESULT и возвращать их при генерации исключения. Для этого нужно заполнить поле HResult в объекте исключения. Дополнительные сведения об исключении предоставляются клиенту через интерфейс IErrorInfo, реализованный в объекте .NET в неуправляемом процессе.

Если создается класс, расширяющий System.Exception, во время создания необходимо задать поле HRESULT. В противном случае значение HRESULT будет присвоено базовым классом. Новые классы исключения можно сопоставить с существующим значением HRESULT, передав значение в конструктор исключения.

Обратите внимание, что среда выполнения иногда будет игнорировать HRESULT, если в потоке присутствует интерфейс IErrorInfo. Такое поведение может возникать, когда HRESULT и IErrorInfo представляют разные ошибки.

Создание нового исключения и сопоставление его с HRESULT

  • Для создания нового класса исключения с именем NoAccessException и сопоставления его значению HRESULT E_ACCESSDENIED можно использовать следующий код.

    Class NoAccessException : public ApplicationException
    {
        NoAccessException () {
        HResult = E_ACCESSDENIED; 
    }
    }
    CMyClass::MethodThatThrows
    {
    throw new NoAccessException();
    }
    

Существуют программы (на любом языке программирования), в которых одновременно используются как управляемый, так и неуправляемый код. Например, в следующем примере кода настраиваемый упаковщик с помощью метода Marshal.ThrowExceptionForHR(int HResult) создает исключение с конкретным результатом HRESULT. Метод просматривает HRESULT и создает соответствующий тип исключения. Например, значение HRESULT в следующем фрагменте кода создает исключение ArgumentException.

CMyClass::MethodThatThrows
{
    Marshal.ThrowExceptionForHR(COR_E_ARGUMENT);
}

В следующей таблице приведен полный перечень значений HRESULT, связанных с классами исключений в .NET Framework.

HRESULT

Исключение .NET

MSEE_E_APPDOMAINUNLOADED

AppDomainUnloadedException

COR_E_APPLICATION

ApplicationException

COR_E_ARGUMENT или E_INVALIDARG

ArgumentException

COR_E_ARGUMENTOUTOFRANGE

ArgumentOutOfRangeException

COR_E_ARITHMETIC или ERROR_ARITHMETIC_OVERFLOW

ArithmeticException

COR_E_ARRAYTYPEMISMATCH

ArrayTypeMismatchException

COR_E_BADIMAGEFORMAT или ERROR_BAD_FORMAT

BadImageFormatException

COR_E_COMEMULATE_ERROR

COMEmulateException

COR_E_CONTEXTMARSHAL

ContextMarshalException

COR_E_CORE

CoreException

NTE_FAIL

CryptographicException

COR_E_DIRECTORYNOTFOUND или ERROR_PATH_NOT_FOUND

DirectoryNotFoundException

COR_E_DIVIDEBYZERO

DivideByZeroException

COR_E_DUPLICATEWAITOBJECT

DuplicateWaitObjectException

COR_E_ENDOFSTREAM

EndOfStreamException

COR_E_TYPELOAD

EntryPointNotFoundException

COR_E_EXCEPTION

Исключение

COR_E_EXECUTIONENGINE

ExecutionEngineException

COR_E_FIELDACCESS

FieldAccessException

COR_E_FILENOTFOUND или ERROR_FILE_NOT_FOUND

FileNotFoundException

COR_E_FORMAT

FormatException

COR_E_INDEXOUTOFRANGE

IndexOutOfRangeException

COR_E_INVALIDCAST или 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 или E_POINTER

NullReferenceException

COR_E_OUTOFMEMORY или

E_OUTOFMEMORY

OutOfMemoryException

COR_E_OVERFLOW

OverflowException

COR_E_PATHTOOLONG или 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 или ERROR_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

Все остальные значения HRESULT

COMException

Чтобы извлечь расширенные сведения об ошибке, управляемый клиент должен проверить поля созданного объекта исключения. Чтобы объект исключения предоставил нужные сведения об ошибке, COM-объект должен реализовать интерфейс IErrorInfo. Среда выполнения использует сведения, предоставленные объектом IErrorInfo, для инициализации объекта исключения.

Если COM-объект не поддерживает интерфейс IErrorInfo, среда выполнения инициализирует объект исключения со значениями, использующимися по умолчанию. В следующей таблице перечислены все поля, связанные с объектом исключения, и указан источник сведений по умолчанию, если COM-объект поддерживает IErrorInfo.

Обратите внимание, что среда выполнения иногда будет игнорировать HRESULT, если в потоке присутствует интерфейс IErrorInfo. Такое поведение может возникать, когда HRESULT и IErrorInfo представляют разные ошибки.

Поле исключения

Источник сведений из COM

ErrorCode

Значение HRESULT, возвращаемое из вызова.

HelpLink

Если значение IErrorInfo->HelpContext не равно нулю, строка формируется путем объединения IErrorInfo->GetHelpFile, "#" and IErrorInfo->GetHelpContext. В противном случае строка возвращается из IErrorInfo->GetHelpFile.

InnerException

Всегда пустая ссылка (Nothing в Visual Basic).

Сообщение

Строка, возвращаемая из IErrorInfo->GetDescription.

Исходный код

Строка возвращается из IErrorInfo->GetSource.

StackTrace

Трассировка стека.

TargetSite

Имя метода, который вернул сбойное значение HRESULT.

Поля исключения, такие как Message, Source и StackTrace недоступны для StackOverflowException.

См. также

Основные понятия

Обработка и создание исключений

Другие ресурсы

Расширенное COM-взаимодействие