【问题标题】:Perl Retry on alarmPerl 报警重试
【发布时间】:2015-12-02 20:20:28
【问题描述】:

我正在尝试在触发警报时重试某些逻辑。那可能吗。 我已将警报定义如下:

local $SIG{ALRM} = sub {
         if($attempt <=5) {
              print "NExt attempt\n";
              $attempt = $attempt + 1;
              my $val = subroutine_call();
         } else{
         Carp::confess "Die now\n"; 
         }

我的代码 sn-p 如下:

 foreach my $x (@array)
 {
     eval {
        alarm(2);
        my $val = subroutine_call();
        alarm(0);
     };

     print "Moving on \n";
     ## some code
  }

我希望在终止应用程序之前触发警报时重试调用 subroutine_call 最多 3 次。在调用 subroutine_call 后(无论是否在触发警报后调用),它应该显示打印语句。

我知道一旦触发警报并且通过警报定义进行 subrountine_call 并且它不会执行 print 语句,代码流将会偏离。我希望它的行为就像没有触发警报一样。

这可能吗?我很怀疑,但想知道是不是这样。

谢谢,

【问题讨论】:

    标签: perl error-handling perl-module alarm


    【解决方案1】:
    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");
       }
    }
    

    【讨论】:

    • 谢谢。这行得通。然而关于这个的一个问题。在应用程序死亡 3 次尝试后,显示的错误消息是“超时”,这是公平的。 local $SIG{ALRM} = sub { die "alarm\n"; 有什么意义? };声明涉及此?终止时它不打印“警报”。我相信它应该打印 $SIG{ALRM} 中提到的消息,而不是在尝试用尽时显式死亡。
    • 呃,如果你不喜欢这条信息,或者除了死也想做点什么,没有什么能阻止你。 // 区分超时和其他异常。
    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多