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

标签 c++ exception static-libraries abort

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

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

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

最佳答案

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

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

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

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

关于c++ - 来自第 3 方静态库的回调中未捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6253574/

相关文章:

c++ - double(?) 模板成员运算符的定义

c++ - SFINAE 尝试使用 bool 给出编译器错误 : "template argument ‘T::value’ involves template parameter"

c++ - 如何将 C++ 头文件从静态库导入到 Obj-C 中?

c++ - Qt 调试:如何知道 QCoreApplication::notifyInternal2 向哪个对象发送消息?

c++ - 如何删除 qmake 自动添加到链接器选项的库路径

java - 运行时错误处理

java - Java 单元测试中的意外异常

c# - 如何从堆栈跟踪中获取行号?

objective-c - iOS : Compiling Static Libraries

visual-studio-2010 - Zlibstat.lib链接错误,VS 2010,zlib 1.2.8