捕获DLL引发的异常

时间:2010-11-09 13:21:56

标签: c++ exception dll

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

mingw32支持两种不同的异常机制:SJLJ和Dwarf2。他们中的一个应该比另一个更好吗?也许唯一的选择是切换到MSVC或ICC,或者单独更改构建选项会有帮助吗?

请注意,即使catch(...)也不会捕获任何异常,甚至不是内置类型(throw 1;),因此它与异常类型的可见性无关。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

当从另一个共享库抛出异常时,gcc会保留有关异常类型的信息,这是一个问题。

请参阅this bug report并尝试使用Google搜索“gcc异常共享库”(我仍然没有找到解决该问题的方法)