You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:10:42