Стратегии обработки ошибок в COM+
В этом разделе описано несколько стратегий обработки ошибок, которые следует учитывать при разработке компонентов для COM+.
Возвращает значение HRESULT для всех методов во всех интерфейсах компонентов. COM+ использует значения HRESULT для отчета о любых ошибках при выполнении вызовов функций или вызовов метода интерфейса. HRESULT указывает, выполнен ли метод успешно или завершился сбоем, и определяет объект, связанный с ошибкой, например RPC, WIN32 или ITF для ошибок, связанных с интерфейсом. Кроме того, системные API предоставляют поиск из HRESULT в строку, описывающую условие ошибки. Использование методов, возвращающих значения HRESULT , являются фундаментальными для хорошо написанных компонентов и являются важными для процесса отладки. Microsoft Visual Basic автоматически определяет каждый метод с помощью HRESULT в качестве возвращаемого значения. В Microsoft Visual C++необходимо явно вернуть HRESULT. Дополнительные сведения о HRESULTs см. в разделе "Структура кодов ошибок COM".
Инициируйте объект коллекции ErrorInfo независимо от того, что означает, что средство разработки предоставляет. Объекты коллекции ErrorInfo часто называются com-исключениями, так как они позволяют объекту передавать (или вызывать) подробные сведения об ошибках вызывающему объекту даже через границы квартиры. Значение этого универсального объекта ошибки заключается в том, что он дополняет HRESULT, расширяя тип сведений об ошибке, которые можно вернуть вызывающему объекту. Каждый объект коллекции ErrorInfo возвращает контекстное описание, источник ошибки и идентификатор интерфейса метода, вызвавшей ошибку. Вы также можете включить указатели на запись в файл справки. Автоматизация предоставляет три интерфейса для управления объектом ошибки. Компонент должен реализовать интерфейс автоматизации ISupportErrorInfo , чтобы объявить поддержку коллекции ErrorInfo . При возникновении ошибки компонент использует интерфейс автоматизации ICreateErrorInfo для инициализации объекта ошибки. После проверки HRESULT вызывающего объекта и обнаружения сбоя вызова метода он запрашивает объект, чтобы узнать, поддерживает ли он коллекцию ErrorInfo . Если это так, вызывающий объект использует интерфейс автоматизации IErrorInfo для получения сведений об ошибке. Программисты Visual Basic имеют простой доступ к объекту коллекции ErrorInfo , который предоставляется через объект Err. Вы можете вызвать ошибки с функцией Err Raise и поймать ошибки с помощью инструкции On Error . Уровень времени выполнения Visual Basic заботится о сопоставлении. Если вы используете поддержку COM-компилятора Visual C++, можно использовать класс _com_raise_error для сообщения об ошибке и класса _com_error для получения сведений об ошибке. COM+ не будет распространять традиционные исключения C++ как расширенные сведения IErrorInfo . Дополнительные сведения об объекте коллекции ErrorInfo см. в разделе "Обработка ошибок" в руководстве по автоматизации.
Примечание.
COM требует, чтобы все объекты коллекции ErrorInfo маршал по значению, подразумевая, что компоненты, реализующие интерфейс автоматизации IErrorInfo, также должны реализовывать и поддерживать интерфейс IMarshal. Реализация интерфейса IMarshal должна поддерживать маршал по значению компонента.
Используйте транзакции для управления сбоями общих ресурсов. Автоматические транзакции могут значительно сократить объем кода обработки ошибок, который необходимо написать при использовании диспетчеров ресурсов, управляемых состоянием. Однако транзакции не устраняют необходимость обработки ошибок в целом. Вам по-прежнему нужно возвращать коды ошибок из методов интерфейса и проверять эти коды ошибок в вызывающем объекте, чтобы избежать ненужных операций для неоправданной транзакции. Дополнительные сведения об объединении обработки ошибок с обработкой транзакций см. в разделе "Скорость транзакций", уведомляя корневой объект.
Явным образом возникают ошибки. Избегайте того, чтобы сведения об ошибках покидали объект, если объект явно не вызывает ошибку. Перехват всех ошибок, созданных средством, и обработка их в коде компонента. По крайней мере, включите стандартный обработчик, чтобы сообщить о непредвиденных ошибках согласованно.
Используйте FACILITY_ITF диапазон ошибок, чтобы сообщить об ошибках, относящихся к интерфейсу. Ошибки, относящиеся к интерфейсу, должны находиться в диапазоне FACILITY_ITF ошибок между 0x0200 и 0xFFFF. Можно определить пользовательский код ошибки в Visual Basic как смещение от vbObjectError. Используйте макрос MAKE_HRESULT в C++ для введения кода ошибки для конкретного интерфейса, как показано в следующем примере:
const HRESULT ERROR_NUMBER = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 10);
См. также