Практическое руководство. Сопоставление значений HRESULT и исключений
Обновлен: Ноябрь 2007
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 |
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). |
Message |
Строка, возвращаемая из IErrorInfo->GetDescription. |
Source |
Строка возвращается из IErrorInfo->GetSource. |
StackTrace |
Трассировка стека. |
TargetSite |
Имя метода, который вернул сбойное значение HRESULT. |
Поля исключения, такие как Message, Source и StackTrace недоступны для StackOverflowException.