Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе описано несколько стратегий обработки ошибок, которые следует учитывать при разработке компонентов для COM+.
Возвращает значение HRESULT для всех методов во всех интерфейсах компонентов. COM+ использует значения HRESULT для отчета о любых ошибках при выполнении вызовов функций или вызовов метода интерфейса. HRESULT указывает, выполнен ли метод успешно или завершился сбоем, и определяет подсистему, связанную с ошибкой, например RPC, WIN32 или ITF для ошибок, связанных с интерфейсом. Кроме того, системные API предоставляют преобразование HRESULT в строку, описывающую условие ошибки. Использование методов, возвращающих значения HRESULT, является фундаментальным для хорошо написанных компонентов и важным для процесса отладки. Microsoft Visual Basic автоматически определяет каждый метод с типом возвращаемого значения HRESULT. В Microsoft Visual C++необходимо явно вернуть HRESULT. Дополнительные сведения о HRESULTs см. в разделе "Структура кодов ошибок COM".
Инициируйте объект коллекции ErrorInfo тем способом, который предоставляет ваше средство разработки.Объекты коллекции ErrorInfo часто называются COM-исключениями, так как они позволяют объекту передавать (или вызывать) подробные сведения об ошибках вызывающему объекту даже через границы apartment. Значение этого универсального объекта ошибки заключается в том, что он дополняет 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 маршалировались по значению, что подразумевает, что компоненты, реализующие интерфейс Automation 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);
Связанные темы