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

Posted

技术标签:

【中文标题】来自第 3 方静态库的回调中未捕获的异常【英文标题】:Uncaught exception in a callback from a 3rd party static library 【发布时间】:2011-06-06 14:31:44 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

int yourCallback( params )

    try 
      doStuff( params );
      return Okay;
     catch (...) 
      return Error;
    

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

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

【讨论】:

感谢您的回答,这是有道理的。【参考方案2】:

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

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

【讨论】:

我认为这几乎肯定是问题所在。它是一个 C 库。但是,我想我只是困惑为什么 Windows 可以处理它而 Linux 不能? @drewarg:无论是什么原因,你都不应该依赖它——请花时间阅读我链接到的问题的答案。 @drewag:我不知道。但是通过 C 代码抛出 C++ 异常很可能无论如何都会调用未定义的行为,所以无论发生什么都是“正确的”。 错误回调基本上只是给出了一些描述发生了什么的字符串,但是导致它的每个函数也会返回一个错误代码,所以我想我只需要在那里处理它。我希望能够有一种通用的方法来处理通过该回调的所有错误,但允许其他调用能够通过更早地捕获异常来覆盖该默认行为。总的来说,任何发生的错误都应该可以通过在调用函数之前验证输入来避免,所以我可能会走这条路。感谢您的帮助!

以上是关于来自第 3 方静态库的回调中未捕获的异常的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 在静态库中抛出异常。如何使用该库从程序中捕获异常?

linux上静态库的创建和使用

第1章 Linux系统编程入门:静态链接库的创建和使用

打静态库所出现的问题以及解决方法

动态库和静态库的区别

.a静态库的制作及使用