簡體   English   中英

如何通過COM公開結構化異常處理捕獲的異常?

[英]How do I expose through COM an exception caught with structured exceptions handling?

我在Visual C ++中實現的COM服務器使用了大量其他C ++代碼。 其他C ++代碼有時會將代碼包裝在__try - __except ,並將結構化異常轉換為自定義C ++異常。 這部分我無法改變。

我的COM服務器的任何方法都不應該允許這些異常通過COM邊界傳播,因此它必須捕獲並將它們轉換為HRESULT 這些自定義C ++異常包含在翻譯期間獲得的原始錯誤代碼 - 它類似於EXCEPTION_ACCESS_VIOLATION 問題是我如何設計一個合適的HRESULT值,以便客戶端盡可能多地獲得有關發生的事情的信息(並且可能在看到訪問沖突后決定重新啟動服務器(以及在inproc的情況下)。

假設這是EXCEPTION_ACCESS_VIOLATION這是在定義WinBase.h

#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION

后者在WinNT.h定義

#define STATUS_ACCESS_VIOLATION ((DWORD)0xC0000005L)

我可以使用HRESULT_FROM_WIN32()將該代碼轉換為HRESULT假設它首先是Win32錯誤

我在這里使用HRESULT_FROM_WIN32()還是使用其他任何方式進行翻譯?

您應該返回HRESULT代碼,您可以在其中選擇適當的代碼來指示操作狀態。 它不一定是失敗代碼,但您通常希望顯示滿足FAILED(...)宏的內容,例如E_FAIL ,或DISP_E_EXCEPTIONHRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)

調用者極不可能與特定的異常相關的HRESULT進行比較,因此特定的失敗代碼對於診斷而言是有意義的。 此外,在退出COM方法之前完成處理異常時,無需返回特定的HRESULT代碼,因為不需要或不需要其他操作。

要提供其他信息,可以使用ISupportErrorInfoIErrorInfo和朋友 調用者可以自動檢索自由文本描述和許多流行環境,因此例如.NET調用者將獲得有關異常消息的附加信息,而不是從HRESULT代碼生成的標准消息。

ATL提供AtlReportError來包裝SetErrorInfo API,它也建議生成HRESULT代碼:

...如果hRes為零,則前四個版本AtlReportError回報DISP_E_EXCEPTION 最后兩個版本返回宏MAKE_HRESULT( 1, FACILITY_ITF, nID )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM