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


Обработка ошибок и возвращаемые значения

VSPackages и COM используют ту же архитектуру для ошибок. GetErrorInfo Функции SetErrorInfo являются частью интерфейса программирования приложений Win32 (API). Любой VSPackage в интегрированной среде разработки (IDE) может вызывать эти глобальные API Win32 для записи подробных сведений об ошибках при получении уведомления об ошибке. Пакет SDK Visual Studio предоставляет сборки взаимодействия для управления сведениями об ошибках.

Методы взаимодействия

В качестве удобства интегрированная среда разработки предоставляет метод, SetErrorInfoчтобы использовать вместо вызова API Win32. В управляемом коде используется SetErrorInfo. При возникновении ошибки на уровне, в котором должно отображаться сообщение об ошибке HRESULT (это часто объект, реализующий IOleCommandTarget обработчик команд), интегрированная среда разработки использует другой метод, ReportErrorInfoчтобы отобразить соответствующее поле сообщения. В управляемом коде ReportErrorInfo используйте метод.

В качестве реализации VSPackage объекты COM обычно реализуются ISupportErrorInfo. Интерфейс гарантирует, что подробные ISupportErrorInfo сведения об ошибках могут перемещаться по вертикали по цепочке вызовов. Объекты, которые могут использоваться в процессах или между потоками, должны поддерживать поддержку ISupportErrorInfo , чтобы обеспечить правильное маршалирование подробных сведений об ошибках обратно вызывающей стороне.

Все объекты, связанные с VSPackage и участвующие в расширении интегрированной среды разработки, включая фабрики редакторов, редакторы, иерархии и предлагаемые службы, должны поддерживать подробные сведения об ошибках. Хотя интегрированная среда разработки не требует реализации ISupportErrorInfoэтих объектов VSPackage, всегда рекомендуется.

Интегрированная среда разработки отвечает за создание отчетов об ошибках и отображение ее пользователю Visual Studio при HRESULT распространении в интегрированную среду разработки. Интегрированная среда разработки также является механизмом создания ErrorInfo объектов.

Общие рекомендации

Вы также можете использовать SetErrorInfo методы, ReportErrorInfo чтобы задать и сообщить об ошибках, которые являются внутренними для реализации VSPackage. Однако в качестве общего правила выполните следующие рекомендации по обработке сообщений об ошибках в VSPackage:

  • Реализуйте ISupportErrorInfo объекты COM VSPackage.

  • Создайте механизм создания отчетов об ошибках, который вызывает SetErrorInfo метод в объектах, реализующих IOleCommandTarget.

  • Позвольте интегрированной среде разработки отображать ошибки для пользователей ReportErrorInfo с помощью метода.

Сведения об ошибке в интегрированной среде разработки

Следующие правила указывают, как обрабатывать сведения об ошибках в интегрированной среде разработки Visual Studio:

  • В качестве оборонительной стратегии, чтобы гарантировать, что устаревшие сведения об ошибке не передаются пользователям, функции, вызывающие ReportErrorInfo метод, должны сначала вызвать SetErrorInfo метод. null Перед вызовом новых сведений об ошибке перед вызовом новых сведений об ошибке перед вызовом сообщений об ошибках передаются в кэш.

  • Функции, которые напрямую не сообщают об ошибках, могут вызывать SetErrorInfo метод только в том случае, если они возвращают ошибку HRESULT. Допускается очистка ErrorInfo записи в функцию или при возврате S_OK. Единственное исключение из этого правила заключается в том, что вызов возвращает ошибку HRESULT , из которой получатель может явно восстановить или безопасно игнорировать.

  • Любая сторона, которая явно игнорирует ошибку HRESULT SetErrorInfo , должна вызывать метод с S_OK. ErrorInfo В противном случае объект может быть случайно использован, если другая сторона создает ошибку, не предоставляя собственныеErrorInfo.

  • Все методы, возникающие при возникновении ошибки HRESULT , рекомендуется вызывать SetErrorInfo метод для предоставления подробных сведений об ошибках. Если возвращаемый HRESULT объект является специальной FACILITY_ITF ошибкой, метод требуется для предоставления правильного ErrorInfo объекта. Если возвращенная ошибка является стандартной системной ошибкой (например, E_OUTOFMEMORY, , E_INVALIDARGE_ABORT, E_UNEXPECTEDи т. д.), то можно вернуть код ошибки без явного SetErrorInfo вызова метода. В качестве оборонительной стратегии программирования при возникновении ошибки HRESULT (включая системные ошибки), всегда вызывайте SetErrorInfo метод, описывая ErrorInfo сбой более подробно или null.

  • Все функции, возвращающие ошибку, вызванную другим вызовом, должны передавать сведения, полученные от неудачного вызова в HRESULT объекте без изменения ErrorInfo объекта.

См. также