2015-12-02 136 views
1

我試圖在報警觸發時重試某些邏輯。那可能嗎。 我已經定義報警如下:Perl在報警時重試

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次後,顯示的錯誤信息是「超時」,這是公平的。什麼是重要的本地$ SIG {ALRM} =子{死「報警\ n」; };聲明涉及此?終止時不打印「警報」。我相信它應該打印$ SIG {ALRM}中提到的消息,而不是在嘗試耗盡時顯式死亡。 – learningMyWayThru

+0

恩,如果你不喜歡這個消息,或者想要做一些除了死亡之外的事情,沒有什麼能阻止你。 //區分超時和其他例外。 – ikegami