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

C++中try/catch块内使用无参throw为何会导致程序崩溃?

问题原因说明

核心结论

你遇到的程序终止行为是C++标准明确规定的合法行为,问题根源是无参throw的使用前提不满足,和catch(...)的捕获能力无关。

无参throw的语义规定

C++标准对无参throw的定义是重新抛出当前正在处理的活跃异常,它本身不会生成新的异常对象:

  • 仅当当前线程正处于异常处理流程中(也就是已经抛出了某个异常、且尚未完成对应catch块的执行)时,无参throw才会正常工作,把当前活跃异常重新抛出给外层catch处理。
  • 如果调用无参throw时没有正在处理的活跃异常,标准规定必须直接调用std::terminate()终止程序,不会进入任何catch分支。

代码问题分析

你给出的代码是在try块内部直接调用无参throw:

try
{
    std::cout << "before throw" << std::endl;
    throw; // 此处没有任何活跃异常
} catch(...)
{
    std::cout << "catch" << std::endl;
}
std::cout << "after try/catch" << std::endl;

此时还没有任何异常被抛出,不存在活跃异常,因此直接触发std::terminate(),输出terminate called without an active exception后程序退出,自然不会执行catch块和后续的输出逻辑。

修正方案

如果要实现你预期的输出,需要抛出一个具体的异常对象,而非使用无参throw,示例如下:

try
{
    std::cout << "before throw" << std::endl;
    throw 1; // 抛出一个具体的异常对象,这里用int仅作示例
} catch(...)
{
    std::cout << "catch" << std::endl;
}
std::cout << "after try/catch" << std::endl;

修改后运行输出就会符合你的预期:

before throw
catch
after try/catch

误解澄清

你提到的catch(...)可以捕获所有异常的描述是正确的,但该特性的生效前提是存在已经被正常抛出的异常。你的代码中程序在异常抛出环节就已经终止,根本没有进入异常匹配阶段,因此catch(...)不会生效。

内容的提问来源于stack exchange,提问作者folibis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:07