如何将C ++异常重新抛出为.net异常,保留消息,堆栈跟踪和原始异常?

时间:2015-10-08 12:03:58

标签: .net c++-cli

我在C ++ / CLI中有一个“包装器库”,它与非托管第三方库进行通信,以使我的.net项目中的功能可用。非托管库的某些函数会抛出从Dim DB As new DataBase 继承的异常。我想在.net空间中将它们重新抛出为有意义的异常。 目前,我在每次非托管呼叫时执行此操作:

std::exception

然而,这既不保留调用堆栈也不保留原始异常。如果我只是让异常冒出来,我只会将其作为try { myThirdPartyObject -> doUnmanagedStuff(); } catch(std::exception e) { throw gcnew InvalidOperationException(gcnew String(e.what())); } 获取,并显示消息“外部组件已抛出异常”。

这是否可行,如果可以,它是如何完成的?

1 个答案:

答案 0 :(得分:2)

我认为这不可行。与托管代码不同,标准C ++ 由运行时引擎支持,后者负责处理这些事情。有一些方法可以捕获堆栈跟踪,但它们是特定于平台的(请参阅Windows方式here);无论如何,应该捕获堆栈信息并将其附加到异常对象之前抛出它,在你的情况下这不是一个选项,因为你正在调用我认为你无法修改的第三方库。