外部链接C库中的异常传播

时间:2010-12-19 22:11:10

标签: c++ c exception external libraries

我正在编写一个使用外部第三方C库的C ++库。因此,我的图书馆将调用此第三方库中的函数,第三方库将回调到我的库的不同部分。

我想知道在这种情况下异常会发生什么? 假设MyLib :: foo()调用外部C库函数,最终调用MyLib :: bar(),并且bar抛出异常,会发生什么?将异常正确传播到foo()中的处理程序吗?

谢谢!

3 个答案:

答案 0 :(得分:6)

  

是否会将异常正确传播到foo()中的处理程序?

我认为异常是否通过外部C代码传播是未定义的。更糟糕的是,C代码没有准备,无法处理异常。 C代码不需要抵抗突然的,意外的返回,因此它不知道RAII等。

当我遇到这样的情况时,我在返回C API之前捕获了异常,将其存储起来,并在从C API调用后重新抛出它。

答案 1 :(得分:1)

这是一个沉重的平台实现细节。通常,异常管道有可能通过C函数激活帧来展开堆栈。必要的是因为CRT通常是用C编写的。但是,C代码不太可能对它感到高兴,状态变异无法恢复。

以防万一这是Windows,C代码确实对它有所了解。 C ++异常被捎带到Windows内置的通用异常支持中,称为结构化异常处理(SEH)。您可以使用__try和__except关键字来调用可以恢复C代码状态的异常过滤器。显然这不便携。

请不要在未提及实施细节的情况下询问实施细节问题。

答案 2 :(得分:1)

阅读(并购买!)Herb Sutter的C++ Coding Standards

  

#62:   不允许异常传播   跨越模块边界。