来自第三方静态库的回调中出现未捕获的异常

Uncaught exception in a callback from a 3rd party static library

本文关键字:异常 回调 第三方 静态      更新时间:2023-10-16

我正在用第三方库编译我的程序。如果内部发生错误,该库将包含一个错误回调。在那个错误回调中,我抛出了一个异常,我有一个单元测试来验证当我做了一些无效的事情时,是否抛出了异常。这一切在Windows中运行得很好,但当我在linux(fedora)中测试时,我会从一个未捕获的异常中得到中止。

我试着用try-catch块直接结束我的呼叫,但没有成功。(此外,我的所有代码都在谷歌测试框架内运行,该框架通常也会捕获异常)。唯一能捕捉到异常的是,如果我将throw语句直接包装在错误回调中的try块中。

有人知道为什么会发生这种情况吗?如果有办法抓住例外的话?

当您与第三方库接口时,您通常必须捕获代码与其代码之间边界上的所有异常:

int yourCallback( params )
{
    try {
      doStuff( params );
      return Okay;
    } catch (...) {
      return Error;
    }
}

原因是您不能确定该库是用C++编写的,或者它使用的C++运行时版本与您的代码使用的版本完全相同。

除非你完全确定代码可以处理你的异常,否则你不能将异常传播给第三方代码。极端的例子是COM,其中您的代码和"其他代码"可以使用任何语言和任何运行时,并且不允许异常通过COM边界传播。

通常情况下,您不应该通过一无所知的代码抛出异常。它可能是C代码,它甚至不会自行清理。

如何处理你的具体问题需要你所接触的第三方图书馆的具体信息。回拨是为了什么?给你一个修理东西的机会?通知您发生错误?你能取消调用它的任何操作吗
处理这种情况的一种方法是在调用回调时将一些信息存储在某个地方,并在调用该库的函数的实际处理完成时检查这些信息。