-Perl-如果发现错误,如何跳转到循环的下一个元素?

Gal*_*ask 1 error-handling perl

我刚用表单完成了一个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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,由于某种原因,我的列表中的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.'
Run Code Online (Sandbox Code Playgroud)

如果发现错误但我跳过循环的下一个项目,我不希望它死;所有这些错误意味着相同的事情(IP当前很忙),通常,我想要做的是:

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

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

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

但是由于IP当前正忙,脚本一直在死于他发现的第一个错误.

fri*_*edo 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 $@;
}
Run Code Online (Sandbox Code Playgroud)

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