代码之家  ›  专栏  ›  技术社区  ›  Tronic

捕获从DLL引发的异常

  •  11
  • Tronic  · 技术社区  · 14 年前

    当异常退出dll中的函数时,mingw32运行时只调用 终止 STD::意外的是,不将异常传播到调用DLL的代码。这个问题有什么解决办法?DLL和调用它的应用程序都是用同一个编译器编译的。

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

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

    2 回复  |  直到 14 年前
        1
  •  5
  •   D.Shawley    14 年前

    运行时是否假定 extern "C" 函数永远不会抛出异常?我不熟悉mingw,但我知道Visual Studio有许多命令行参数来控制这种行为。例如, /EHs 选项会使它假设 外部“C” 永远不会抛出,它将通过调用来处理确实抛出的函数 std::unexpected() 依次呼叫 std::terminate() . 你可能想打电话 std::set_unexpected() 要建立一个意外的异常处理程序并查看它是否陷阱。

        2
  •  0
  •   BЈовић    14 年前

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

    this bug report 尝试谷歌搜索“GCC异常共享库”(我还没有找到解决这个问题的方法)