共用方式為


錯誤處理和傳回值

VSPackage 和 COM 針對錯誤使用相同的架構。 和 GetErrorInfoSetErrorInfo式是 Win32 應用程式開發介面 (API) 的一部分。 集成開發環境 (IDE) 中的任何 VSPackage 都可以呼叫這些全域 Win32 API,以在收到錯誤通知時記錄豐富的錯誤資訊。 Visual Studio SDK 提供 Interop 元件來管理錯誤資訊。

Interop 方法

為了方便起見,IDE 會提供方法 SetErrorInfo,以使用 而不是呼叫 Win32 API。 在 Managed 程式代碼中,使用 SetErrorInfo。 當錯誤 HRESULT 到達應該顯示錯誤訊息的層級時(這通常是實作命令處理程序的物件 IOleCommandTarget ),IDE 會使用另一種方法 ReportErrorInfo來顯示適當的消息框。 在 Managed 程式代碼中, ReportErrorInfo 使用 方法。

作為 VSPackage 實作者,您的 COM 物件通常會實作 ISupportErrorInfo。 介面 ISupportErrorInfo 可確保豐富的錯誤資訊可以垂直向上移動呼叫鏈結。 跨進程或跨線程使用的對象必須支援 ISupportErrorInfo ,以確保將豐富的錯誤資訊正確地封送處理回呼叫端。

與 VSPackage 相關且涉及擴充 IDE 的所有物件,包括編輯器處理站、編輯器、階層和提供的服務,都應該支援豐富的錯誤資訊。 雖然 IDE 不需要實作這些 VSPackage 物件 ISupportErrorInfo,但一律會受到鼓勵。

每當 傳播至 IDE 時 HRESULT ,IDE 會負責報告錯誤資訊,並將其顯示給 Visual Studio 的使用者。 IDE 也是建立 ErrorInfo 對象的機制。

一般指導方針

您也可以使用 SetErrorInfoReportErrorInfo 方法來設定和報告 VSPackage 實作內部的錯誤。 不過,一般規則遵循下列指導方針來處理 VSPackage 中的錯誤訊息:

IDE 中的錯誤資訊

下列規則指出如何處理 Visual Studio IDE 中的錯誤資訊:

  • 作為保證不會向用戶回報過時錯誤資訊的防禦策略,呼叫 方法的 ReportErrorInfo 函式應該先呼叫 SetErrorInfo 方法。 null傳入以清除快取的錯誤訊息,再呼叫可能設定新錯誤資訊的任何專案。

  • 只有在傳回錯誤HRESULT時,才允許不直接報告錯誤訊息的函式呼叫 SetErrorInfo 方法。 允許清除 ErrorInfo 函式專案上的 ,或在傳 S_OK回 時清除 。 此規則的唯一例外是當呼叫傳回接收方可以明確復原或安全地忽略的錯誤 HRESULT 時。

  • 明確忽略錯誤HRESULT的任何合作對象都必須使用 S_OK呼叫 SetErrorInfo 方法。 否則,當另一方產生錯誤而不提供自己的 ErrorInfo時,ErrorInfo可能會不小心使用物件。

  • 鼓勵產生錯誤 HRESULT 的所有方法呼叫 SetErrorInfo 方法,以提供豐富的錯誤資訊。 如果傳 HRESULT 回的 是特殊 FACILITY_ITF 錯誤,則需要 方法才能提供適當的 ErrorInfo物件。 如果傳回的錯誤是標準系統錯誤(例如 、E_OUTOFMEMORYE_INVALIDARGE_ABORTE_UNEXPECTED等。),則傳回錯誤碼而不明確呼叫 SetErrorInfo 方法是可以接受的。 作為防禦性編碼策略,當產生錯誤 HRESULT 時(包括系統錯誤),請一律呼叫 SetErrorInfo 方法, ErrorInfo 以更詳細地描述失敗,或 null

  • 傳回另一個呼叫所產生錯誤的所有函式,都必須傳遞從 中 HRESULT 失敗呼叫接收到的資訊,而不需要修改 ErrorInfo 物件。

另請參閱