Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Методы COM сообщают об ошибках, возвращая HRESULTs; методы .NET сообщают об этом путем вызова исключений. Среда выполнения обрабатывает переход между двумя. Каждый класс исключений в .NET сопоставляется с HRESULT.
Определяемые пользователем классы исключений могут указать любое подходящее значение HRESULT. Эти классы исключений могут динамически изменять объект HRESULT, возвращаемый при создании исключения, задав HResult поле для объекта исключения. Дополнительные сведения об исключении предоставляются клиенту через IErrorInfo интерфейс, который реализуется в объекте .NET в неуправляемом процессе.
Если вы создаете класс, расширяющийся System.Exception, необходимо задать поле HRESULT во время строительства. В противном случае базовый класс назначает значение HRESULT. Вы можете сопоставить новые классы исключений с существующим HRESULT, указав значение в конструкторе исключения.
Обратите внимание, что среда выполнения иногда игнорирует HRESULT в тех случаях, когда в потоке присутствует IErrorInfo. Это поведение может происходить в тех случаях, когда HRESULT и IErrorInfo не представляют ту же ошибку.
Создание класса исключений и сопоставление его с HRESULT
Используйте следующий код, чтобы создать новый класс исключений, называемый
NoAccessExceptionи сопоставить его с HRESULTE_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. Значения HRESULT без явных сопоставлений сопоставляются с COMException. Полное и актуальное сопоставление можно найти в репозитории dotnet/runtime.
| HRESULT | исключение .NET |
|---|---|
COR_E_APPLICATION |
ApplicationException |
COR_E_ARGUMENT или E_INVALIDARG |
ArgumentException |
COR_E_ARGUMENTOUTOFRANGE |
ArgumentOutOfRangeException |
COR_E_ARITHMETIC or ERROR_ARITHMETIC_OVERFLOW |
ArithmeticException |
COR_E_ARRAYTYPEMISMATCH |
ArrayTypeMismatchException |
COR_E_BADIMAGEFORMAT or ERROR_BAD_FORMAT |
BadImageFormatException |
COR_E_DIRECTORYNOTFOUND or ERROR_PATH_NOT_FOUND |
DirectoryNotFoundException |
COR_E_DIVIDEBYZERO |
DivideByZeroException |
COR_E_DUPLICATEWAITOBJECT |
DuplicateWaitObjectException |
COR_E_ENDOFSTREAM |
EndOfStreamException |
COR_E_ENTRYPOINTNOTFOUND |
EntryPointNotFoundException |
COR_E_EXCEPTION |
Exception |
COR_E_EXECUTIONENGINE |
ExecutionEngineException |
COR_E_FIELDACCESS |
FieldAccessException |
COR_E_FILENOTFOUND or ERROR_FILE_NOT_FOUND |
FileNotFoundException |
COR_E_FORMAT |
FormatException |
COR_E_INDEXOUTOFRANGE |
IndexOutOfRangeException |
COR_E_INVALIDCAST or E_NOINTERFACE |
InvalidCastException |
COR_E_INVALIDFILTERCRITERIA |
InvalidFilterCriteriaException |
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_NOTFINITENUMBER |
NotFiniteNumberException |
E_NOTIMPL |
NotImplementedException |
COR_E_NOTSUPPORTED |
NotSupportedException |
COR_E_NULLREFERENCE orE_POINTER |
NullReferenceException |
COR_E_OUTOFMEMORY orE_OUTOFMEMORY |
OutOfMemoryException |
COR_E_OVERFLOW |
OverflowException |
COR_E_PATHTOOLONG or ERROR_FILENAME_EXCED_RANGE |
PathTooLongException |
COR_E_RANK |
RankException |
COR_E_REFLECTIONTYPELOAD |
ReflectionTypeLoadException |
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_THREADINTERRUPTED |
ThreadInterruptedException |
COR_E_THREADSTATE |
ThreadStateException |
COR_E_TYPELOAD |
TypeLoadException |
COR_E_TYPEINITIALIZATION |
TypeInitializationException |
COR_E_VERIFICATION |
VerificationException |
Чтобы получить расширенные сведения об ошибках, управляемый клиент должен проверить поля созданного объекта исключения. Чтобы объект исключения предоставлял полезную информацию об ошибке, com-объект должен реализовать IErrorInfo интерфейс. Среда выполнения использует сведения, предоставленные IErrorInfo для инициализации объекта исключения.
Если COM-объект не поддерживается IErrorInfo, среда выполнения инициализирует объект исключения со значениями по умолчанию. В следующей таблице перечислены все поля, связанные с объектом исключения, и указан источник сведений по умолчанию, если COM-объект поддерживает IErrorInfo.
Обратите внимание, что среда выполнения иногда игнорирует HRESULT в случаях, когда в потоке присутствует IErrorInfo. Это поведение может происходить в тех случаях, когда HRESULT и IErrorInfo не представляют ту же ошибку.
| Поле исключения | Источник информации из COM |
|---|---|
ErrorCode |
HRESULT вернулся из вызова. |
HelpLink |
Если IErrorInfo->HelpContext значение ненулевое, строка формируется путем объединения IErrorInfo->GetHelpFile и "#" и IErrorInfo->GetHelpContext. В противном случае строка возвращается из IErrorInfo->GetHelpFile. |
InnerException |
Всегда является пустой ссылкой (Nothingв Visual Basic). |
Message |
Строка, возвращаемая из IErrorInfo->GetDescription. |
Source |
Строка, возвращаемая из IErrorInfo->GetSource. |
StackTrace |
Трассировка стека. |
TargetSite |
Имя метода, который вернул код HRESULT ошибки. |
Поля исключения, такие как Message, Source и StackTrace, недоступны для StackOverflowException.