在 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 例外,因為它們允許物件將豐富的錯誤資訊傳遞至其呼叫方,即使是跨越公寓邊界。 這個泛型錯誤物件的作用在於補充 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);
相關主題