1

我刚刚完成了一个 Perl 脚本(效果很好),格式如下:

my @plages_IP = ('10.7.10.103' ,'10,121,10,7', '10.120.10.10');

foreach my $IP (@plages_IP)
{
   DO ALL THE THING I WANT;
}

我的问题是,由于某种原因,我启动脚本时列表中的 1 个或多个 IP 可能很忙。在这种情况下,我得到一些 perl 错误(这是正常的)并且脚本死了:

'Error POSTing http://10,121,10,7/wcd/login.cgi: Can't connect to 10,121,10,7:80 (Bad hostname) at C:\Users\STAGEDVIR\Desktop\gnagna\Retrieve_Counter_C364_C224_C203.pl line 51.'

'Error POSTing http://10.64.10.3/wcd/login.cgi: Not Found at C:\Users\STAGEDVIR\Desktop\gnagna\Retrieve_Counter_C203.pl line 45.'

如果发现错误,我不希望它死掉,而是跳到循环的下一项;所有这些错误都意味着同一件事(IP 当前很忙),通常,我想做的是:

if(ANY_ERROR && LOOP_NOT_EMPTY)
{
    DON'T DIE;
    JUMP TO THE NEXT ELEMENT OF THE LOOP;
}

我尝试了一些解决方案eval{ routine_might_die }; warn $@ if $@;和一些方法,例如:

unless($boolean_descripting_last_request->is_success)
{
    print(STDERR "Currently busy $IP ! \n");
    **next**;
}

但是由于 IP 当前忙,脚本一直在等待他发现的第一个错误。

4

1 回答 1

5

你放eval错地方了。如果您想在循环中捕获错误,请将其放在eval那里。

my @plages_IP = ('10.7.10.103' ,'10,121,10,7', '10.120.10.10');

foreach my $IP (@plages_IP) {
    eval { 
        # stuff that might die
    };

    warn $@ if $@;
}

没有必要,next因为循环无论如何都会继续。

于 2013-05-29T13:49:14.070 回答