我正在编写一个使用外部第三方C库的C ++库。因此,我的图书馆将调用此第三方库中的函数,第三方库将回调到我的库的不同部分。
我想知道在这种情况下异常会发生什么? 假设MyLib :: foo()调用外部C库函数,最终调用MyLib :: bar(),并且bar抛出异常,会发生什么?将异常正确传播到foo()中的处理程序吗?
谢谢!
答案 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: 不允许异常传播 跨越模块边界。