在Raku中能否通过trait添加CONTROL phaser作为控制异常处理程序?
Raku中通过trait添加CONTROL phaser的实现方法
问题原因
你尝试的add_phaser方案无法生效,核心原因是Raku的CONTROL/CATCH这类异常处理phaser,是在编译期静态绑定到子程序的调用栈上下文的。动态通过add_phaser添加的phaser,只会在显式调用fire_phasers方法时触发,不会被运行时的异常分发逻辑自动识别,因此无法捕获抛出的控制异常。
你通过has_phasers和fire_phasers验证到phaser添加成功,也恰好印证了这一点:phaser确实被存入了子程序的phaser列表,但运行时异常捕获流程不会主动扫描这部分动态添加的内容。
可行实现方案
可以通过子程序包装(wrap)的方式实现需求,将包含CONTROL块的逻辑套在原子程序执行流程外层,这里的CONTROL块会在编译期完成上下文绑定,可以正常捕获异常:
class CX::Oops does X::Control {}; sub trait_mod:<is>(Sub $fn, :$oopsable) { # 包装原子程序 $fn.wrap: sub (|) { CONTROL { when CX::Oops { note 'Oops!'; .resume } } # 执行原子程序逻辑 callsame } } sub g is oopsable { CX::Oops.new.throw; } g; # 输出:Oops
内容的提问来源于stack exchange,提问作者codesections
相关产品推荐
相关产品推荐

