2014-05-21 186 views
0

我有基於COM的C++項目,其中正在訪問C#程序集。我想編寫代碼來處理C#程序集拋出的com項目中的異常。如何處理非託管代碼中的託管異常

我試着放置try和catch塊,但是沒有拋出異常,而是HRESULT值小於零。我需要確切的消息字符串來顯示C#API拋出的內容。

請爲此提供指導。

+0

如果您只想知道錯誤消息,則可以將最後一個異常消息保留在變量中,然後使用GetLastErrorMsg()方法公開它。當HRESULT值小於零時調用該方法。 – mbm

+0

我不認爲你可以從非託管世界訪問託管信息(例外字符串)。看看這個:http://blogs.msdn.com/b/liviuc/archive/2009/10/13/.net-interop-and-exception-handling-in-mixed-applications.aspx。它說:「......如果你真的需要這些信息,你將無法在本地處理程序中獲得託管的異常信息 - 你必須在C++/CLI中使用try/catch - 也就是在託管上下文中。」你可以抓住它。 –

+0

我沒有找到GetLastErrorMsg()...我可以看到GetLastError()返回DWORD。 – Srilaxmi

回答

1

您有兩種可用的信息來源。首先,返回的HRESULT不是任意的,每個託管異常都有一個distinctive HRESULT,它可以幫助您識別拋出的Exception對象。

接下來,CLR執行IErrorInfo interface。您可以在您用來調用託管方法的接口指針上獲取IErrorInfo接口指針。 IErrorInfo :: GetDescription()返回Exception.Message屬性值。

這就是它結束的地方,沒辦法得到神聖的堆棧跟蹤。