为何promise的final_suspend必须声明为noexcept?
关于C++协程
final_suspend()调用时机与异常控制的问题 问题拆解
- 是不是正如C++标准中描述的那样,
promise.final_suspend()是在try块之外被调用的? - 或者换个说法(不确定是否等价):这样设计是为了确保从协程中逃逸的异常,仅为那些从原始*
function-body*中逃逸、且未被promise.unhandled_exception()处理的异常?
解答
第一个问题的答案是肯定的:根据C++标准定义,
promise.final_suspend()的调用确实处于包裹协程体的try块范围之外。第二个问题的核心逻辑成立:这个设计的关键目标之一就是严格限定协程向外传播的异常范围。当协程体(即原始
function-body)抛出未被内部捕获的异常时,会优先触发promise.unhandled_exception()让promise对象处理异常——只有当promise没有处理掉该异常时,它才会从协程中逃逸出去。
而final_suspend()在try块外执行,一方面避免了它的调用被协程体的异常处理逻辑捕获,另一方面也保证了最终能逃逸的异常只能是协程体中未被处理的那些,不会混入final_suspend()执行时可能产生的异常(当然标准也明确建议final_suspend()不应该抛出异常,这是额外的约束)。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

