当异常退出 DLL 中的函数时,mingw32 运行时仅调用 terminate std::unexpected 而不是将异常传播到调用 DLL 的代码。这个问题有什么解决方案? DLL 和调用它的应用程序都使用相同的编译器编译。
mingw32支持两种不同的异常机制:SJLJ和Dwarf2。为此,他们中的一个是否应该比另一个工作得更好?也许唯一的选择是切换到 MSVC 或 ICC,或者单独更改构建选项可能会有帮助?
请注意,即使是 catch(...) 也不会捕获任何异常,甚至内置类型 (throw 1;) 也不会,因此这与异常类型的可见性无关。
最佳答案
运行时是否假设 extern "C"
函数永远不会抛出异常?我不熟悉 MinGW,但我知道 Visual Studio 有一堆命令行参数来控制这种行为。例如, /EHs
选项将导致它假定 extern "C"
永远不会抛出,它将通过调用 std::unexpected()
处理抛出的函数。依次调用 std::terminate()
.您可能想调用 std::set_unexpected()
建立一个意外的异常处理程序并查看它是否陷阱。
关于c++ - 捕获从 DLL 抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4134078/