【问题标题】:Failure Behavior of Moose Role Modifier FunctionsMoose 角色修饰函数的失效行为
【发布时间】:2011-12-23 10:15:12
【问题描述】:

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

有人能解释一下“扁平化”过程在这种情况下是如何工作的,以及是否有任何情况下 eval 会失败但 after 块会运行?

谢谢 乔什

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?';
    }
}

【问题讨论】:

    标签: perl eval roles moose


    【解决方案1】:

    如果main 死亡,则 after 修饰符将不会运行。但是,eval 可能会失败,但 $@ 可能是错误的。听起来这一定是这里发生的事情。如果eval 失败,但$@ 为假,您的错误处理代码将不会运行,main 不会抛出异常。因此,main 之后的代码将被运行。

    这是Try::Tiny 保护你免受的事情之一。

    【讨论】:

      【解决方案2】:
      • MyRole::main() 通常会在 Main::main() 之后执行。

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

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

      【讨论】:

        猜你喜欢
        • 2013-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 2011-01-17
        • 1970-01-01
        • 1970-01-01
        • 2018-02-16
        相关资源
        最近更新 更多