外部链接C库中的exception传播

我正在编写一个使用外部第三方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跨模块边界传播。