Альтернатива блокированию eval?

Есть ли эквивалент следующего -

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 $@;

[EDIT] Я хотел бы знать все возможные причины, по которым скрипт (который использует много библиотек) может выйти из строя. Операторы die не находятся в том месте, где я могу редактировать.


person trinity    schedule 18.08.2013    source источник
comment
Разве ты не хочешь просто warn? Или вы хотите протестировать режимы отказа из библиотеки? Чтение источника может работать лучше там. Я не совсем уверен, чего вы пытаетесь достичь.   -  person amon    schedule 18.08.2013
comment
Последний. Я хотел бы знать все возможные причины, по которым скрипт (который использует много библиотек) может выйти из строя. Операторы die не находятся в том месте, где я могу редактировать.   -  person trinity    schedule 18.08.2013


Ответы (2)


переопределение die не совсем альтернатива eval, но это то, о чем, я думаю, вы спрашиваете, ловушка 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;
person optional    schedule 18.08.2013
comment
Как раз то, что я искал, спасибо!! Однако есть места, где это не сработает. Некоторые библиотеки используют Internals::SvREADONLY, из-за чего скрипт умирает. Но это выходит за рамки этого вопроса, так как мне придется копаться в неизвестном царстве модулей perl Internals. - person trinity; 18.08.2013
comment
Кроме того, пока вы здесь, не могли бы вы объяснить, зачем нам нужен ‹code›unless ($^S)‹/code›. Я прочитал его значение здесь - catonmat.net/download/perl.predefined.variables .pdf — означает ли это, что штампы внутри evals будут пропущены?? - person trinity; 18.08.2013
comment
Он будет пропускать предупреждения для die-s внутри evals — это полезно знать на случай, если вам это может понадобиться. - person optional; 03.09.2013

Вы имеете в виду что-то вроде этого?

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

warn "There were the following problems:\n$problems";
person choroba    schedule 18.08.2013
comment
Привет, я хотел бы выяснить различные причины, по которым скрипт может дать сбой. И нет, это не то, что я ищу. Я, вероятно, обновлю вопрос, чтобы отразить это! - person trinity; 18.08.2013
comment
@trinity: это не имеет ничего общего с вашим вопросом. Он также должен работать. - person choroba; 18.08.2013