当前位置:  开发笔记 > 编程语言 > 正文

Perl重试闹钟

如何解决《Perl重试闹钟》经验,为你挑选了1个好方法。

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

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语句.我希望它表现得好像如果警报没有被触发就会有.

那可能吗?我持怀疑态度,但想知道是不是这样.

谢谢,



1> ikegami..:
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");
   }
}

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有