【问题标题】:Catching exceptions thrown from DLLs捕获从 DLL 抛出的异常
【发布时间】:2011-05-07 06:03:26
【问题描述】:

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

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

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

【问题讨论】:

  • 有趣。可能每个库都有静态链接的 C++ 运行时?

标签: c++ exception dll


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当从另一个共享库抛出异常时,gcc 保留有关异常类型的信息似乎存在问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-27
      • 2013-06-24
      • 1970-01-01
      • 2016-02-17
      • 2018-08-31
      • 1970-01-01
      • 2018-03-09
      • 2017-10-14
      相关资源
      最近更新 更多