role X::Control is Exception { }

此角色将异常转换为 控制异常,例如 CX::NextCX::Take。除了定义之外,它没有其他代码。

自 Rakudo 2019.03 起,throw 混合在此角色 X::Control 中的对象可以引发控制异常,该异常由 CONTROL phaser 捕获,而不是 CATCH。这允许定义自定义控制异常。

例如,我们在下面定义的自定义 CX::Vaya 控制异常

class CX::Vaya does X::Control {
    has $.message
}
 
sub ea {
    CONTROL {
        default {
            say "Controlled { .^name }{ .message }"
        }
    }
    CX::Vaya.newmessage => "I messed up!" ).throw;
 
}
ea;
# OUTPUT: «Controlled CX::Vaya: I messed up!␤»