2015-12-02 3 views
1

Я пытаюсь повторить определенную логику при срабатывании тревоги. Это возможно. я определил тревогу, как показано ниже: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 будет выполняться с помощью определения тревоги и не будет выполнять оператор печати. Я хочу, чтобы он вел себя так, как будто бы это было бы, если бы сигнал тревоги не срабатывал.

Возможно ли это? Я настроен скептически, но хотел бы знать, так ли это.

Спасибо,

ответ

5
local $SIG{ALRM} = sub { die "alarm\n"; }; 

for my $x (@array) { 
    my $attempts_remaining = 3; 
    while (1) { 
     last if eval { 
     alarm(2); 
     subroutine_call(); 
     alarm(0); 
     return 1; 
     }; 

     my $e = [email protected]; 
     die($e) if $e ne "alarm\n"; 
     die("Timeout!\n") if !--$attempts_remaining; 
     warn("Timeout! Trying again...\n"); 
    } 
} 
+0

Спасибо. Это работает. Однако вопрос об этом. После 3 попыток, когда приложение умирает, отображается сообщение об ошибке «Время ожидания», которое справедливо. Что такое значение local $ SIG {ALRM} = sub {die "alarm \ n"; }; заявление в этом? При завершении он не печатает «будильник». Я считаю, что это должно печатать сообщение, упомянутое в $ SIG {ALRM}, а не явное умирание, когда попытки исчерпаны. – learningMyWayThru

+0

Ух, если вам не нравится сообщение или вы хотите сделать что-то другое, кроме как умереть, вам ничего не остановить. // Различие между таймаутами и другими исключениями. – ikegami

 Смежные вопросы

  • Нет связанных вопросов^_^