Я пытаюсь повторить определенную логику при срабатывании тревоги. Это возможно. я определил тревогу, как показано ниже:Perl Retry on alarm
local $SIG{ALRM} = sub {
if($attempt <=5) {
print "NExt attempt\n";
$attempt = $attempt + 1;
my $val = subroutine_call();
} else{
Carp::confess "Die now\n";
}
Мой фрагмент кода, как показано ниже:
foreach my $x (@array)
{
eval {
alarm(2);
my $val = subroutine_call();
alarm(0);
};
print "Moving on \n";
## some code
}
Я хочу, чтобы повторить попытку вызова subroutine_call до 3 раз, когда сигнал тревоги перед завершением приложения. После вызова subrountine_call (независимо от того, был ли он вызван после срабатывания тревоги или нет), он должен отображать инструкцию печати.
Я знаю, что поток кода будет отклоняться после срабатывания тревоги, а subrountine_call будет выполняться с помощью определения тревоги и не будет выполнять оператор печати. Я хочу, чтобы он вел себя так, как будто бы это было бы, если бы сигнал тревоги не срабатывал.
Возможно ли это? Я настроен скептически, но хотел бы знать, так ли это.
Спасибо,
Спасибо. Это работает. Однако вопрос об этом. После 3 попыток, когда приложение умирает, отображается сообщение об ошибке «Время ожидания», которое справедливо. Что такое значение local $ SIG {ALRM} = sub {die "alarm \ n"; }; заявление в этом? При завершении он не печатает «будильник». Я считаю, что это должно печатать сообщение, упомянутое в $ SIG {ALRM}, а не явное умирание, когда попытки исчерпаны. – learningMyWayThru
Ух, если вам не нравится сообщение или вы хотите сделать что-то другое, кроме как умереть, вам ничего не остановить. // Различие между таймаутами и другими исключениями. – ikegami