![](/img/trans.png)
[英]How exactly does the SEH (structured exception handling) mechanism work on ARM?
[英]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_EXCEPTION
或HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION)
。
調用者極不可能與特定的異常相關的HRESULT
進行比較,因此特定的失敗代碼對於診斷而言是有意義的。 此外,在退出COM方法之前完成處理異常時,無需返回特定的HRESULT
代碼,因為不需要或不需要其他操作。
要提供其他信息,可以使用ISupportErrorInfo
, IErrorInfo
和朋友 。 調用者可以自動檢索自由文本描述和許多流行環境,因此例如.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.