2010-11-09 184 views
11

当一个异常退出DLL中的函数时,mingw32运行时只是简单地调用 终止 std :: unexpected而不是将该异常传播到调用该DLL的代码。这个问题有什么解决方案? DLL和调用它的应用程序都使用相同的编译器进行编译。捕获从DLL中抛出的异常

mingw32支持两种不同的异常机制:SJLJ和Dwarf2。如果他们中的一个比另一个更好地工作?也许唯一的选择是切换到MSVC或ICC,或者更改构建选项可以帮助吗?

请注意,甚至没有捕获(...)将捕获任何异常,甚至没有内置类型(抛出1;),所以它不是关于异常类型的可见性。

+0

有趣。可能每个库都有静态链接的C++运行时? – sharptooth 2010-11-09 13:24:07

回答

0

存在接缝成为gcc问题,当从其他共享库引发异常时,保留有关异常类型的信息。

this bug report,并尝试google搜索“GCC例外共享库”(我还没有找到一个解决这一问题)

5

是运行假设extern "C"功能绝不会抛出异常?我不熟悉MinGW,但我知道Visual Studio有一堆命令行参数来控制这种行为。例如,/EHs选项将使其假定extern "C"永远不会抛出,它将通过调用std::unexpected()来处理抛出的函数,后者又调用std::terminate()。您可能想要调用std::set_unexpected()来建立一个意外的异常处理程序并查看它是否陷阱。