当前位置: 首页 > 知识库问答 >
问题:

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

姬正文
2023-03-14

我目前正在开发一个基于插件架构的游戏。该可执行文件主要由一个共享库加载程序和几个接口定义组成。所有有趣的事情都发生在启动时加载的动态共享库中。

其中一个库类在某些情况下引发异常。我希望能够捕捉到这个异常并用它做有用的事情,但这就是它变得奇怪的地方。请参见以下简化示例代码:

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");
}
...

cpp存在于一个成功加载的动态共享库中,该库随后创建了一个类plugin的对象。exception_derived_from_runtime_error在应用程序中定义。除了之外,没有throw()

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

共有1个答案

秦昂然
2023-03-14

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

 类似资料:
  • 我通过激发Baeldung在Spring Security页面上的防止暴力身份验证尝试,为我的登录服务实现了暴力阻止机制,如下所示: 当用户未经验证时,LoginService抛出InvalidCredentialException(),然后我试图在AuthenticationFailureListener类中捕获此异常: 当出现错误时,则登录测试服务。将调用loginFailed()方法。然而,

  • 所以 我有一个函数,有一个回调,所以我把它包装在一个挂起函数使用,但当它错误了,它是崩溃整个应用程序。 这里有一个概念是正在发生的事情。 2022-03-04 16:09:45.410 19289-19438/in.app.androidE/AndreidRuntime: FATAL EXCEPTION: DefaultDispatcher-Worers-3进程:in.app.android,PI

  • 问题内容: 我正在从python脚本中调用一个so文件。据我了解,我真的不需要释放使用ctypes在python中打开的共享库。但是,在我的so文件代码中,它dlopen另一个so文件并且不执行dlclose()。在这种情况下,从python端使用安全吗?我不必释放在ctypes内部加载的共享库soe文件吗? 问题答案: 始终遵循 “自己清洁后清理 ”的规则(尽管现代技术会为您提供清洁方面的帮助)

  • 我无法在Spring中捕获异步方法抛出的异常。我已经编写了一个未捕获的异常处理程序来捕获,但没有成功。该应用程序将启用启动任意数量的永远运行的异步作业。我认为我的异步方法需要返回Future,以便我可以将其存储在hashmap中并检查其状态或停止作业。我也可以通过存储它来获取所有正在运行的作业。我认为我不能使用get method of Future,因为如果输入正确,它会阻塞,我的作业将永远运行

  • 我正在尝试使用以下代码使用流 API 获取 S3 对象的文件大小: 如果该项不存在,我会得到以下错误: [2015年10月13日星期二23:03:32][错误][客户端54.225.205.152]PHP警告:找不到文件或目录:s3://mybucket/myfile.jpg在/var/www/vendor/Aws/Aws-SDK-PHP/src/Aws/S3/stream wrapper . P

  • 问题内容: 关于程序流,这一直困扰着我一段时间。 我想知道是否有可能从Method中捕获错误,以阻止它执行通常无法跟着它执行的Method,就像下面我无法工作的示例所示。 我通常会有一个静态int变量,该变量会在程序运行时初始化为0,然后,如果某个方法捕获到异常,它将使int递增,并且每个方法仅在int为0时才运行。 这行得通,但我只是想知道是否可以用异常处理替换int shindig。 问题答案