0

我正在使用 3rd 方库编译我的程序。如果内部发生错误,该库包含错误回调。在那个错误回调中,我抛出了一个异常,并且我有一个单元测试来验证当我做一些无效的事情时抛出了异常。这一切在 Windows 中运行良好,但是当我在 linux (fedora) 中测试它时,我因未捕获的异常而中止。

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

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

4

2 回答 2

3

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

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

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

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

于 2011-06-06T14:33:48.383 回答
1

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

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

于 2011-06-06T14:34:41.313 回答