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

时间:2011-06-06 14:31:44

标签: c++ exception-handling static-libraries abort

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

我尝试用try-catch块直接包裹我的电话,但没有运气。 (此外,我的所有代码都在google测试框架中运行,通常也会捕获异常)。似乎唯一能捕获异常的是我将throw语句直接包装在try块中的错误回调中。

有没有人知道为什么会发生这种情况以及是否有办法捕获异常?

2 个答案:

答案 0 :(得分:3)

当你interface with third-party libraries时,你通常必须在代码和代码之间的边界上捕获所有异常:

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

原因是您不能确定库是用C ++编写的,还是使用与代码一样的C ++运行时版本。

除非您完全确定代码可以处理您的异常,否则您无法将异常传播到第三方代码。最极端的例子是COM,你的代码和“其他代码”都可以是任何语言和运行时,你不允许异常通过COM边界传播。

答案 1 :(得分:1)

通常,您不应该抛出“通过”您不了解的代码。它可能是C代码,它甚至不会自行清理。

如何处理您的具体问题需要有关您正在连接的第三方库的具体信息。那里的回调是什么?给你机会修理东西?通知您发生了错误?你可以取消它的任何操作吗?
处理这种情况的一种方法是在调用回调时在某处存储一些信息,并在实际处理从调用该库的函数完成时检查该信息。