2008-09-22 58 views
4

我正在爲引發異常的現有本機類寫一個.NET包裝類。在本地C++異常和受管異常之間進行翻譯的最佳實踐是什麼?捕獲並重新拋出一對一的基礎(例如std :: invalid_argument - > System.System.ArgumentException)?有沒有已經繪製過的地圖?在C++/CLI包裝類中翻譯異常的最佳實踐

回答

4

沒有我知道的標準映射。我過去所做的是翻譯我所瞭解的那些,以及System.Runtime.InteropServices.SEHException的catch塊。所有未翻譯的異常都將變成該異常。只要你有拋出異常的代碼的調試版本,你應該得到一個很好的堆棧跟蹤。然後你可以去查看異常並編寫包裝器。

但在最後一個項目,我不得不這樣做,我的東西就簡單多了,我最後寫一對夫婦System.Exception的衍生物爲logic_error和runtime_error。然後我會捕獲這兩個基類,並使用typeid(err)編寫拋出的.NET消息。這樣我就不會「丟失」從C++拋出的東西,但不必映射除最重要的東西外的所有東西。

2

一對一映射對我來說似乎是最熱門的方法。由於特定於應用程序的異常,「通用」映射幾乎不可能,儘管STL異常類有一些明顯的映射。

也有是從非託管代碼SEH異常的問題。根據您的情況,可能需要抓住幷包裹它們。

2

我認爲這取決於包裝的設計。如果管理器包裝器的接口將與非託管庫的接口幾乎相同,則重新引發異常1:1。如果您要顯着改變界面,那麼會拋出最適合新界面的異常。無論哪種方式,確保每當無法完成操作以符合.NET設計準則時,包裝就會拋出異常。

1

你真的想做什麼?

互操作已經轉換原生的例外管理,包括SEH例外。但是,良好的設計規定,應在本機API級別捕獲所有異常。除非有充分的理由,否則你不應該偏離這一點。我們對你的設計不夠了解。