2014-05-21 129 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属性值。

这就是它结束的地方,没办法得到神圣的堆栈跟踪。