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

在catch块内调用的lambda中使用std::current_exception是否合法?

问题对应的代码场景
//std::once_flag eptrFlag;
//std::exception_ptr eptr;
//...
try
{
    // may throw exceptions
}
catch (...)
{
    std::call_once(eptrFlag,
    [&]() 
    {
        //...
        eptr = std::current_exception(); 
    });
}
结论

这段代码是安全的,不属于未定义行为。

原理说明
  • 首先明确C++标准中「异常处理期间」的范围:从异常被抛出、进入异常处理流程开始,到匹配的catch子句执行完成前的整个阶段都属于异常处理期间,并不限制只能在catch子句的最外层直接调用相关接口。
  • 在catch块内部调用的任何同步执行的代码,包括普通函数调用、lambda闭包执行、标准库函数内部逻辑,只要执行时还没有退出当前catch块的作用域,都属于在异常处理期间运行。
  • 你代码中传入std::call_once的lambda是同步执行的,执行时仍然处于当前catch(...)块的运行周期内,完全满足std::current_exception()的调用要求,可以正确捕获到当前正在处理的异常对象。

你查阅的cppreference描述里的「通常为catch子句中」只是列举最常见的场景,并不是限制只有catch最外层的代码才符合调用条件。

额外注意点

唯一需要注意的是业务逻辑层面的问题:如果eptrFlag已经被其他线程触发过,std::call_once会跳过lambda的执行,eptr不会被赋值为当前异常,这个属于逻辑设计问题,不属于语言层面的未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:39:01