共用方式為


在 COM+ 中處理錯誤的策略

當您開發 COM+的元件時,本主題會識別數個要記住的錯誤處理策略。

  • 傳回所有元件介面中所有方法的 HRESULT 值。  COM+ 會使用 HRESULT 值報告進行函數調用或介面方法呼叫時發生的任何錯誤。 HRESULT 指出方法是否成功或失敗,並識別與錯誤相關聯的設施,例如 RPC、WIN32 或 ITF,以取得介面特定錯誤。 此外,系統 API 也會提供從 HRESULT 查閱描述錯誤狀況的字串。 使用傳回 HRESULT 值的方法對撰寫良好的元件而言是基本的,而且對於偵錯程式而言很重要。 Microsoft Visual Basic 會自動以 HRESULT 作為傳回來定義每個方法。 在 Microsoft Visual C++中,您必須明確傳回 HRESULT。 如需 HRESULT 的其他資訊,請參閱 COM 錯誤碼的結構。

  • 以開發工具所提供的任何方式起始 ErrorInfo 集合物件。ErrorInfo 集合物件通常稱為 COM 例外狀況,因為它們允許物件將豐富的錯誤資訊傳遞至其呼叫者,甚至跨越 Apartment 界限。 這個泛型錯誤物件的值是它補充 HRESULT,並擴充您可以傳回給呼叫端的錯誤資訊類型。 每個 ErrorInfo 集合物件都會傳回內容描述、錯誤的來源,以及產生錯誤之方法的介面識別碼。 您也可以在說明檔中包含項目指標。 自動化提供三個介面來管理錯誤物件。 您的元件必須實作 ISupportErrorInfo 自動化介面,以公告其對 ErrorInfo 集合的支援。 發生錯誤時,元件會使用 ICreateErrorInfo 自動化介面來初始化錯誤物件。 呼叫端檢查 HRESULT 並發現方法呼叫失敗之後,它會查詢 物件,以查看它是否支援 ErrorInfo 集合。 如果這樣做,呼叫端會使用 IErrorInfo 自動化介面來擷取錯誤資訊。 Visual Basic 程式設計人員可以輕鬆地存取 ErrorInfo 集合物件,而 ErrorInfo 集合對像是透過 Err 物件公開的。 您可以使用 Err Raise 函式引發錯誤,並使用 On Error 語句攔截錯誤。 Visual Basic 運行時間層會為您處理對應。 如果您使用 Visual C++ COM 編譯程式支援,您可以使用 _com_raise_error 類別來報告錯誤,並使用 _com_error 類別來擷取錯誤資訊。 COM+ 不會將傳統C++例外狀況傳播為擴充 IErrorInfo 資訊。 如需 ErrorInfo 集合物件的其他資訊,請參閱自動化指南中的。

    注意

    COM 要求所有 ErrorInfo 集合對象都會依值封送處理,這表示實作 IErrorInfo 自動化介面的元件也必須實作並支援 IMarshal 介面。 IMarshal 介面實作必須依元件的值支援封送處理。

     

  • 使用交易來管理共用資源失敗。 使用狀態管理的資源管理員時,自動交易可以大幅減少您必須撰寫的錯誤處理程式碼數量。 不過,交易不會完全消除錯誤處理的需求。 您仍然需要從介面方法傳回錯誤碼,並檢查呼叫端內的這些錯誤碼,以避免對註定要的交易執行不必要的工作。 如需將錯誤處理與交易處理結合的其他資訊,請參閱 通知根物件來加速交易。

  • 明確引發錯誤。 除非對象明確引發錯誤,否則避免讓錯誤資訊離開物件。 攔截所有工具產生的錯誤,並在元件程式代碼中加以處理。 至少,請包含標準處理程式,以一致的方式報告非預期的錯誤。

  • 使用FACILITY_ITF範圍的錯誤來報告介面特定錯誤。 介面特定錯誤應位於0x0200與0xFFFF之間的FACILITY_ITF範圍內。 您可以將 Visual Basic 中的自定義錯誤碼定義為 vbObjectError 的位移。 使用 C++ 中的 MAKE_HRESULT 宏來引進介面特定的錯誤碼,如下列範例所示:

    const HRESULT ERROR_NUMBER = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 10);
    

錯誤隔離和失敗原則

尋找錯誤的來源

COM+ 如何修改傳回值

解譯錯誤碼

疑難排解