当一个异常退出DLL中的函数时,mingw32运行时只需调用 terminate std :: unexpected,而不是将异常传播给调用DLL的代码。这个问题有什么解决方案? DLL和调用它的应用程序都使用相同的编译器进行编译。
mingw32支持两种不同的异常机制:SJLJ和Dwarf2。他们中的一个应该比另一个更好吗?也许唯一的选择是切换到MSVC或ICC,或者单独更改构建选项会有帮助吗?
请注意,即使catch(...)也不会捕获任何异常,甚至不是内置类型(throw 1;),因此它与异常类型的可见性无关。
答案 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异常共享库”(我仍然没有找到解决该问题的方法)