我正在编写一个使用外部第三方C库的C ++库。 因此,我的图书馆将调用此第三方库中的函数,第三方库将回调到我的库的不同部分。
我想知道在这种情况下exception会发生什么? 假设MyLib :: foo()调用外部C库函数,最终调用MyLib :: bar(),并且bar抛出exception,会发生什么? 将exception正确传播到foo()中的处理程序吗?
谢谢!
将exception正确传播到
foo()
的处理程序吗?
我认为exception是否通过外部C代码传播是未定义的。 更糟糕的是,C代码没有准备好,无法处理exception。 C代码不需要抵御突然的,意外的返回,因此它不知道RAII等。
当我遇到这种情况时,我在返回到C API之前捕获了exception,将其存储起来,并在从C API调用后重新抛出它。
这是一个沉重的平台实现细节。 通常,exception管道有可能通过C函数激活帧来展开堆栈。 必要的是因为CRT通常是用C编写的。但是,C代码不太可能对它感到高兴,状态变异无法恢复。
如果这是Windows,C代码确实有一个镜头。 C ++exception被捎带到Windows内置的通用exception支持中,称为结构化exception处理(SEH)。 您可以使用__try和__except关键字来调用可以恢复C代码状态的exceptionfilter。 显然这不便携。
请不要在没有提及实施细节的情况下询问实施细节问题。
阅读(并购买!)Herb Sutter的C ++编码标准
#62:不允许exception跨模块边界传播。
以上就是c/c++开发分享外部链接C库中的exception传播相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544811.html