は2

2016-12-10 4 views

答えて

3

としてすぐに削除する必要がすぐに削除されるべき呼び出しの第二セットはevalではないためにも動作しないこと。

for (my $num_tries = 3; ;) { 
    last if eval { 
     my $stuff1 = function1(); 
     my $stuff2 = function2(); 
     function3(); 
     return 1; # No exception. 
    }; 

    --$num_tries 
     or die([email protected]); 

    chomp(my $e = [email protected]); 
    warn("$e Retrying..."); 
} 

function4(); 

以上がevalfunction3();を移動。あなたはそれが例外をスローすることを可能にしたい(または多分それは本当にreturnlast、などだ)場合は、代わりに次を使用することができます。

my $num_tries = 3; 
while (1) 
    last if eval { 
     my $stuff1 = function1(); 
     my $stuff2 = function2(); 
     return 1; # No exception. 
    } || !--$num_tries; 

    chomp(my $e = [email protected]); 
    warn("$e Retrying..."); 
} 

if ($num_tries) { 
    function3(); 
} else { 
    warn([email protected]); 
} 

function4(); 

これは再び少し複雑になって、それでは、サブを使わせています!あなたの答えのための

if (non_fatal_retry { 
    my $stuff1 = function1(); 
    my $stuff2 = function2(); 
}, 3) { 
    function3(); 
} 

function4(); 
+0

おかげで、私は後に実行する必要があるコードを持っているので、私は、それはここで失敗した場合は死にたくない:

sub non_fatal_retry(&$) { my ($cb, $num_tries) = @_ while (!eval { $cb->(); 1 }) { --$num_tries or warn([email protected]), return 0; chomp(my $e = [email protected]); warn("$e Retrying..."); } return 1; } 

ソリューションとなります。エラーがなければ「どうすれば」他に入り、再試行があれば続行しますか? – Thomas

+0

それを捕まえるには 'eval'を使うか、' last'とフラグを使う。その宣言を動かすことによって '$ num_retries'をフラグとして使うことさえできます。 – ikegami

+0

私のコードを変更しましたが、これは機能しますか?私は、あなたがちょうど私に言ったことを、どのように使用するのか分からない、ありがとう! – Thomas