鉴于下面的代码示例,当运行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?';
}
}
答案 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()中。