来自第三方静态库的回调中出现未捕获的异常
Uncaught exception in a callback from a 3rd party static library
我正在用第三方库编译我的程序。如果内部发生错误,该库将包含一个错误回调。在那个错误回调中,我抛出了一个异常,我有一个单元测试来验证当我做了一些无效的事情时,是否抛出了异常。这一切在Windows中运行得很好,但当我在linux(fedora)中测试时,我会从一个未捕获的异常中得到中止。
我试着用try-catch块直接结束我的呼叫,但没有成功。(此外,我的所有代码都在谷歌测试框架内运行,该框架通常也会捕获异常)。唯一能捕捉到异常的是,如果我将throw语句直接包装在错误回调中的try块中。
有人知道为什么会发生这种情况吗?如果有办法抓住例外的话?
当您与第三方库接口时,您通常必须捕获代码与其代码之间边界上的所有异常:
int yourCallback( params )
{
try {
doStuff( params );
return Okay;
} catch (...) {
return Error;
}
}
原因是您不能确定该库是用C++编写的,或者它使用的C++运行时版本与您的代码使用的版本完全相同。
除非你完全确定代码可以处理你的异常,否则你不能将异常传播给第三方代码。极端的例子是COM,其中您的代码和"其他代码"可以使用任何语言和任何运行时,并且不允许异常通过COM边界传播。
通常情况下,您不应该通过一无所知的代码抛出异常。它可能是C代码,它甚至不会自行清理。
如何处理你的具体问题需要你所接触的第三方图书馆的具体信息。回拨是为了什么?给你一个修理东西的机会?通知您发生错误?你能取消调用它的任何操作吗
处理这种情况的一种方法是在调用回调时将一些信息存储在某个地方,并在调用该库的函数的实际处理完成时检查这些信息。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- Cocos2d-X菜单回调引发异常
- 用户回调时未处理的异常
- 在clCreateContext()中注册的回调中用C++抛出异常是否安全
- 为什么在win32计时器回调中引发的未处理异常未被调试器视为未处理异常
- OpenGL使用鼠标点击与鼠标光标移动的回调时出现未处理的异常
- 在处理回调函数时,通常的异常处理方式是什么?
- 来自第三方静态库的回调中出现未捕获的异常