【问题标题】:An alternative to block eval?阻止评估的替代方案?
【发布时间】:2013-08-20 10:30:37
【问题描述】:

是否有以下等价物-

eval { die "reason 1"; }; warn $@ if $@;
eval { die "reason 2"; }; warn $@ if $@;
eval { die "reason 3"; }; warn $@ if $@;
.
.

如您所见,以下代码不会打印出脚本死机的所有可能原因..

eval {
    die "reason 1";
    die "reason 2";
    die "reason 3";
};
warn $@ if $@;

[编辑] 我想知道脚本(使用很多库)可能失败的所有可能原因。 die 语句不在我可以编辑的地方。

【问题讨论】:

  • 你不想要warn吗?或者您想从库中测试故障模式?在那里阅读源代码可能会更好。我不太确定你想要完成什么。
  • 后者。我想知道脚本(使用很多库)可能失败的所有可能原因。 die 语句不在我可以编辑的地方。

标签: perl try-catch eval die


【解决方案1】:

覆盖 die 并不完全是 eval 的替代方案,但我认为这就是您要问的问题,捕获 die 并将其变成警告、记录 die 和恢复/继续程序

$ perl -e " eval{die 1;}; die 2; die 3; "
2 at -e line 1.

$ perl -Mwarnerous  -e " eval{die 1;}; die 2; die 3; "
FAKE die : 2 at -e line 1
FAKE die : 3 at -e line 1

$ cat warnerous.pm
*CORE::GLOBAL::die = sub {
    unless( $^S ){
        warn( qq{FAKE die : @_ @{[sprintf q{at %s line %s },(caller)[1,2] ]}\n} );
    }
};
1;

【讨论】:

  • 正是我想要的,谢谢!但是在某些地方这不起作用 - 一些库使用 Internals::SvREADONLY 导致脚本死机。但这超出了这个问题的范围,因为这将涉及我挖掘 perl Internals 模块的未知领域..
  • 另外,当你在这里时,你能解释一下为什么我们需要 unless ($^S)。我在这里通读了它的含义-catonmat.net/download/perl.predefined.variables.pdf-这是否意味着这将跳过 evals 中的 dies ??
  • 它会跳过 evals 中的 die-s 警告——如果你可能需要它,知道它很有用
【解决方案2】:

你的意思是这样的吗?

my $problems;
for my $r (1 .. 3) {
    eval { die "reason $r"; 1 } or $problems .= $@;
}

warn "There were the following problems:\n$problems";

【讨论】:

  • 嗨,我想找出脚本失败的各种原因。不,这不是我要找的。我可能会更新问题以反映这一点!
  • @trinity:与你的问题无关。它也应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多