我试图在触发警报时重试某些逻辑.那可能吗.我已将警报定义如下:
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后(无论是否在触发警报后调用),都应显示print语句.
我知道一旦触发警报并且通过警报定义生成subrountine_call,代码流就会偏离,并且它不会执行print语句.我希望它表现得好像如果警报没有被触发就会有.
那可能吗?我持怀疑态度,但想知道是不是这样.
谢谢,
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 = $@; die($e) if $e ne "alarm\n"; die("Timeout!\n") if !--$attempts_remaining; warn("Timeout! Trying again...\n"); } }