C++异常跨C函数调用传递能否被正确捕获?
异常跨C/C++函数调用的传递问题
这个问题的答案很明确:不能,F2抛出的异常无法穿过C函数F1被F0的catch块捕获,反而会直接触发程序终止(C17前可能触发std::unexpected(),但C17及之后直接调用std::terminate())。
具体原因可以拆解成这几点:
- C语言本身完全不支持异常机制,C编译器生成的代码里没有任何和异常处理、栈展开相关的逻辑。当异常传递到C函数的调用帧时,没有对应的"通道"让它继续向上传递。
- 你可能会疑惑:F2用
extern "C"暴露给F1,是不是就变成C函数了?其实不是——extern "C"只改变了函数的名字修饰规则,让C代码能正确找到这个函数,F2本身依然是会抛出异常的C++函数。 - 当异常从F2抛出后,沿着调用栈往上找catch块:到F1的调用帧时,因为F1是纯C函数,没有异常处理的相关信息,程序无法继续把异常传递给上层的F0。这种情况下,标准C++会判定为"未捕获的异常",直接触发终止逻辑。
如果想要让异常能被F0捕获,你需要让F1也处于C的异常处理体系中——比如把F1改成C实现(即使依然用extern "C"声明,让其他C代码能调用),这样C++编译器会为它生成包含异常处理逻辑的调用帧,异常才能顺利穿过它到达F0的catch块。
内容的提问来源于stack exchange,提问作者J Mkdjion
相关产品推荐
相关产品推荐

