Поделиться через


Класс System.Runtime.InteropServices.COMException

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Класс COMException представляет собой исключение, которое возникает при возврате нераспознанного HRESULT из вызова метода COM.

Общая среда выполнения (CLR) преобразует хорошо известные HRESULT в исключения .NET, позволяя объектам COM возвращать значимую информацию об ошибках управляемым клиентам. Сопоставление HRESULT-исключений также работает в обратном направлении, возвращая определенные значения HRESULT для неуправляемых клиентов. Дополнительные сведения о сопоставлении см. в статье "Сопоставление HRESULTs и исключений".

Когда среда выполнения сталкивается с незнакомым HRESULT (HRESULT, который не имеет определенного соответствующего исключения COMException), создаётся экземпляр этого класса. Это универсальное исключение предоставляет те же члены, что и любое исключение, и наследует общедоступное ErrorCode свойство, содержащее HRESULT, возвращаемое вызывающей стороной. Если сообщение об ошибке доступно для среды выполнения (полученное из интерфейса IErrorInfo или Err объекта в Visual Basic или в некоторых случаях из операционной системы), сообщение возвращается вызывающей системе. Однако если разработчик COM-компонента не включает сообщение об ошибке, среда выполнения возвращает восемь цифр HRESULT вместо строки сообщения. Наличие HRESULT позволяет вызывающей стороне определить причину общего исключения.

Обработка исключения COMException

Ниже приведены некоторые рекомендации по устранению неисправностей с COMException исключениями.

Проверьте свойство ErrorCode. Когда среда выполнения сталкивается с незнакомым HRESULT и вызывает исключение COMException, свойство ErrorCode включает либо сообщение об ошибке, либо, если сообщение об ошибке недоступно, восьмизначное значение HRESULT. Сообщение об ошибке или значение HRESULT поможет определить причину исключения.

Список значений HRESULT см. в разделе "Общие значения HRESULT".

При передаче к методам объектов Microsoft Office аргументов с поздней привязкой может возникнуть исключение, если эти объекты являются COM-объектами. Позднее связывание предполагает, что такие вызовы метода включают ByRef параметр и что передаваемое свойство имеет set аксессор. Если свойство отсутствует или неверно, .NET генерирует MissingMethodException исключение (с CORE_E_MISSINGMETHOD HRESULT). Чтобы обойти это поведение, используйте объекты с ранними привязками или передайте переменную вместо свойства объекта.

COM используется для обмена данными между Visual Studio и процессом размещения. Так как он используется перед выполнением кода, вызов CoInitializeSecurity приводит к возникновению этого исключения. В некоторых случаях запуск Visual Studio от имени администратора может устранить проблему. Вы также можете отключить процесс размещения.

Создание исключения COMException

Несмотря на то что можно использовать класс COMException для возврата конкретных значений HRESULT неуправляемым клиентам, лучше выбрасывать конкретное исключение .NET, чем использовать общее исключение. Учитывайте, что управляемые и неуправляемые клиенты могут использовать ваш объект .NET, и вызов HRESULT управляемому клиенту менее понятен, чем выброс исключения.