我目前正在使用基于插件的架构开发游戏。可执行文件主要由共享库加载器和几个接口定义组成。所有有趣的东西都发生在动态共享库中,这些库在启动时加载。
其中一个库类在某些情况下会抛出异常。我希望能够捕获这个异常并使用它做有用的东西,但这是它变得奇怪的地方。请参阅以下简化示例代码:
的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().
}
}
希望有人有个主意。感谢您提供的每一个帮助。
答案 0 :(得分:0)
正如评论中所提到的,这似乎是Windows上共享库的问题。如果卸载库并且在此库中创建的对象仍保留在内存中,则会发生此行为。该应用程序似乎立即崩溃。如果使用gcc作为交叉编译器或MinGW,则会发现对此问题的唯一引用。另请参阅https://www.sourceware.org/ml/crossgcc/2005-01/msg00022.html