无法从main.cpp中的共享库中捕获异常

时间:2014-05-04 17:09:13

标签: c++ exception c++11 shared-libraries try-catch

我目前正在使用基于插件的架构开发游戏。可执行文件主要由共享库加载器和几个接口定义组成。所有有趣的东西都发生在动态共享库中,这些库在启动时加载。

其中一个库类在某些情况下会抛出异常。我希望能够捕获这个异常并使用它做有用的东西,但这是它变得奇怪的地方。请参阅以下简化示例代码:

的main.cpp

int main()
{
  try
  {
    Application app;
    app.loadPlugin();
    app.doStuffWithPlugin();
    return 0;
  }
  catch(const std::exception& ex)
  {
     // Log exception
     return 1;
  }
}

Application.cpp

...
void doStuffWithPlugin()
{
  plugin.doStuff();
}
...

Plugin.cpp

...
void doStuff()
{
   throw exception_derived_from_runtime_error("Something is wrong");
}
...

Plugin.cpp存在于动态共享库中,该库已成功加载,并且之后创建了类Plugin的对象。 exception_derived_from_runtime_error在应用程序中定义。没有throw()noexcept

我希望在main中捕获exception_derived_from_runtime_error,但这并不会发生。使用C ++ 11使用GCC 4.8编译,应用程序与This application has requested the Runtime to terminate it in an unusual way.崩溃。

我将catch(const std::exception& ex)替换为catch(...),但这并没有任何区别。奇怪的是,如果我在doStuffWithPlugin()中捕获异常,它就可以工作。如果我使用throw;重新抛出它,它会再次失败但如果我使用throw ex;则可以捕获它:

Application.cpp

void doStuffWithPlugin()
{
  try
  {
      plugin.doStuff();
  }
  catch(const exception_derived_from_runtime_error& ex)
  {
     // throw; <- Not caught in main().
     // throw ex; <- Caught in main().
  }
}

希望有人有个主意。感谢您提供的每一个帮助。

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,这似乎是Windows上共享库的问题。如果卸载库并且在此库中创建的对象仍保留在内存中,则会发生此行为。该应用程序似乎立即崩溃。如果使用gcc作为交叉编译器或MinGW,则会发现对此问题的唯一引用。另请参阅https://www.sourceware.org/ml/crossgcc/2005-01/msg00022.html