【发布时间】:2015-10-08 12:03:57
【问题描述】:
我在 C++/CLI 中有一个“包装器库”,它与非托管的第三方库通信,以使我的 .net 项目中的功能可用。非托管库的某些函数会抛出继承自 std::exception 的异常。我想在 .net 空间中将它们作为有意义的异常重新抛出。
目前,我对每个非托管调用都执行此操作:
try {
myThirdPartyObject -> doUnmanagedStuff();
} catch(std::exception e) {
throw gcnew InvalidOperationException(gcnew String(e.what()));
}
但是,这既不会保留调用堆栈,也不会保留原始异常。如果我只是让异常冒泡,我只会将其作为 SEHException 并带有消息“外部组件已引发异常”。
这可能吗?如果可以,是如何做到的?
【问题讨论】:
-
有点离题,但你应该通过引用来捕获 C++ 异常 (
catch (std::exception& e)) -
确实是为了避免切片。 “const” 参考更好(
catch (const std::exception& e)) -
@SébastienCôté:为什么捕获 const 引用更好?您永远不会在
catch块中遇到 const 异常。并且在重新抛出之前您不能调用任何非常量函数或修改异常。 -
在原生 C++ 程序中,除了 exception::what() 之外,您不会得到堆栈跟踪或其他任何东西。当你重新抛出它时,它并没有神奇地变得更好。