com - handling中文 - swift try catch用法



ISupportErrorInfo的實現-這是什麼意思? (1)

我對它的理解(基於一些相關的MSDN頁面)是通過實現ISupportErrorInfo ,指示類中的一個或多個接口通過調用SetErrorInfo返回錯誤信息,而不是僅僅返回失敗HRESULT

為此,您的ISuportErrorInfo::InterfaceSupportsErrorInfo應只返回S_OK您的類的實際上使用SetErrorInfo返回錯誤信息給調用方的類的接口, 只有那些接口。

例如,假設你有一個類實現了你寫的一個叫做IFoo的接口,它有一個DoSomething方法。 如果有人創建了你的類的一個實例並調用IFoo::DoSomething ,如果DoSomething返回失敗HRESULT ,它們應該執行以下操作(從各種MSDN頁面轉述,但是我從這裡開始: http//msdn.microsoft。 com / en-us / library / ms221510.aspx ):

  • 調用IFoo指針的QueryInterface以獲取正在實現IFoo的對象的ISupportErrorInfo接口

  • 如果被調用的對像沒有實現ISupportErrorInfo ,則調用者將不得不根據HRESULT值來處理錯誤,或者將其傳遞給調用堆棧。

  • 如果被調用的對像沒有實現ISupportErrorInfo ,那麼調用者應該調用ISupportErrorInfo::InterfaceSupportsErrorInfo ,傳入返回錯誤的接口的REFIID 。 在這種情況下, IFoo接口的DoSomething方法返回一個錯誤,所以你可以將REFIID_IFoo (假設已經定義)傳遞給InterfaceSupportsErrorInfo

  • 如果InterfaceSupportsErrorInfo返回S_OK ,那麼調用者在這一點上知道它可以通過調用GetErrorInfo來獲取有關該錯誤的更多詳細信息。 如果InterfaceSupportsErrorInfo返回S_FALSE ,則調用者可以假定被調用的接口不提供詳細的錯誤信息,並且將不得不依賴返回的HRESULT來確定發生了什麼。

這個有點令人困惑/錯綜複雜的錯誤處理API的原因似乎是為了靈活性(就我而言,儘管如此,這畢竟 COM)。 通過這種設計,一個類可以支持多個接口,但是並不是每個接口都需要使用SetErrorInfo來從其方法返回錯誤信息。 你可以通過SetErrorInfo在你的類上有一定的選擇接口返回詳細的錯誤信息,而其他接口可以繼續使用正常的HRESULT來指示錯誤。

總之, ISupportErrorInfo接口是一種通知調用代碼的方法,至少有一個類實現的接口可以返回詳細的錯誤信息, InterfaceSupportsErrorInfo方法告訴調用者給定的接口是否是這些接口之一。 如果是這樣,那麼調用者可以通過調用GetErrorInfo來獲取詳細的錯誤信息。

ISupportErrorInfo接口是什麼意思? 我有點難以理解。 來自MSDN:

該接口確保錯誤信息可以正確傳播到呼叫鏈上。 使用錯誤處理接口的自動化對象必須實現ISupportErrorInfo。

此方法指示接口是否支持IErrorInfo接口。

HRESULT InterfaceSupportsErrorInfo(
  REFIID riid
);

InterfaceSupportsErrorInfo返回S_OK是什麼意思? 你應該為所有接口返回S_OK嗎? 一些?