Moose角色修饰函数的失效行为

时间:2011-12-22 23:00:11

标签: perl eval roles moose

鉴于下面的代码示例,当运行Main :: main时,如果eval块失败,我会假设角色中的'after'块永远不会运行。但是,我正在调试间歇性且难以销毁的错误,这表明事实并非如此。

有人可以解释“扁平化”过程在这种情况下是如何工作的,并且如果有任何条件,eval会失败但是后块会运行吗?

由于 约什

package MyRole;
use Moose::Role;

after 'main' => sub {
    #some code that depends on main executing
};

package Main;
use Moose;
with 'MyRole';

sub main {
    eval {
        #main work
    };
    if ($@) {
        die 'what happens now?';
    }
}

2 个答案:

答案 0 :(得分:2)

如果main死亡,那么后修改器将不会运行。但是,eval可能会失败,但$@可能会失败。听起来这一定是这里发生的事情。如果eval失败,但$@为false,则错误处理代码将无法运行,main将不会引发异常。因此,将运行after main代码。

这是Try::Tiny保护您免受攻击的事情之一。

答案 1 :(得分:2)

  • MyRole :: main()通常会在Main :: main()之后执行。

  • 它们并没有完全扁平化为一个接一个的方法,因为您在Main :: main()中返回的内容仍然是返回的内容,并且您在MyRole :: main()中返回的任何内容都将被忽略。

  • 如果'main work'失败,MyRole :: main()将不会执行,因为你也死在catch(if $@)块中,这意味着执行流程在它到达MyRole之前就死掉了:: main()中。