我在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()));
}
获取,并显示消息“外部组件已抛出异常”。
这是否可行,如果可以,它是如何完成的?
答案 0 :(得分:2)
我认为这不可行。与托管代码不同,标准C ++ 不由运行时引擎支持,后者负责处理这些事情。有一些方法可以捕获堆栈跟踪,但它们是特定于平台的(请参阅Windows方式here);无论如何,应该捕获堆栈信息并将其附加到异常对象之前抛出它,在你的情况下这不是一个选项,因为你正在调用我认为你无法修改的第三方库。