c++ - 捕获从 DLL 抛出的异常

标签 c++ exception dll

当异常退出 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/

相关文章:

c++ - 互斥量的可升级所有权如何影响其他线程?

android - Camera.open() 抛出 java.lang.RuntimeException : Fail to connect to camera service

java - 循环异常处理

c# - 将字节数组从 C dll 返回到 C#

c++ - 我可以将外部 dll 添加到 npapi 插件吗,它应该安装在浏览器中?

c++ - 升级我的 mac 后编译 mpic++ 不再有效

c++ - 二叉搜索树,分配指向模板化结构节点的指针

c++ - 对在头文件中实例化指针感到困惑

python - __cause__ 和 __context__ 有什么区别?

java - 如何给jni dll函数名添加前缀