2017-06-01 10 views
1

私はperlスクリプトの一部で、現在、このコードを持っている(正常に動作)タイニーてみてください::とモジュール:: Runtimeを使用してのtry-catchを使用して:回避警告

try { 
     no strict 'refs'; 
     require_module $modules{$action_name}; 
     if (&{"FFTG::${actiontype}::run"}($action, $fs, $log)) { 
       $log->res("SUCCESS"); 
     } else { 
       if ($action->{mandatory}[0] == 1) { 
         $log->res("FAIL, exiting."); 
         last ACTION; 
       } else { 
         $log->res("FAIL, but not mandatory, continuing.."); 
       } 
     } 
} 
catch { 
     $log->res("MODULE NOT FOUND"); 
     print "no module found for action '$actiontype', unable to process this action\n"; 
     #warn $_; 
}; 

が、残念ながら、スクリプトが完璧に動作

starting transfer .. 
no module found for action 'Transfer', unable to process this action 
no module found for action 'Transfer', unable to process this action 
no module found for action 'Archive', unable to process this action 
Exiting subroutine via last at ./bin/fftgv2.pl line 130. 
Exiting eval via last at ./bin/fftgv2.pl line 130. 
Exiting subroutine via last at ./bin/fftgv2.pl line 130. 
ending transfer 

場合でも、私はそれが「ダーティ」にこれらのエラーを表示するには見つける:スクリプトの出力は、出力の途中でこれらの3つのエラーを(すべての行がサブルーチンを終了から始まる)を示し、標準出力。

これを取り除く方法はありますか? (このrequire_moduleのものでスクリプトを終了させたくないので、/ etcなどの場合は使用できません)。 私はちょうど私たちは、これらの警告は名前のグループに属していることがわかりperldoc perldiagでこれらの警告

おかげで再び について

+1

あなたが書いたコードのものではないのですか、それとも自分のコードベースのものではありませんか? – simbabque

+0

https://grep.metacpan.org/search?size=20&q=via+last&qd=&qft= – simbabque

+0

私は彼らが何かから来ていると思います。しかし、私はまだこれを完全に理解していません。 – simbabque

答えて

4

(それがない)それがモジュールを見つけることができない場合は、私のスクリプトは警告を表示したいのですが、ありません」終了する "。

fftgv2.plの行130の直前でno warnings "exiting";を使用した場合は、そのブロックの残りの部分について警告が消えます。

...もちろん、警告に注意を払っても最悪のアイデアではないでしょう。

+0

ありがとう、魅力のように動作します! – olivierg

2

tryステートメントのブロック内にlastがあるため、警告が発行されます。 tryは実際にはPerl構文の一部ではありません。それはキーワードではないので、ブロックは実際にブロックではありません。それはTry :: Tinyのプロトタイプsub try (&;@)のためにブロックのように扱われている匿名サブです。

下から見ていきます。 ./bin/fftgv2.plラインで最後の130

を経由してサブルーチンを終了

Exiting subroutine via last at ./bin/fftgv2.pl line 130.^
Exiting eval via last at ./bin/fftgv2.pl line 130.  | 
Exiting subroutine via last at ./bin/fftgv2.pl line 130. | 

に第3の警告は、あなたのtryためのサブから実際にあります。 ./bin/fftgv2.plラインで最後の130

経由のevalを終了

try {      # here 
     no strict 'refs'; 

::タイニーimplements try via a call to evalPerl's built-in way of catching errorsを試しているので、次のいずれかです。

これは、コードのトライです::タイニー用途(ハイライトコメント鉱山):./bin/fftgv2.plライン130の最後を経てサブルーチンを終了

# failed will be true if the eval dies, because 1 will not be returned 
    # from the eval body 
    my $failed = not eval {    # here is 2) 
    [email protected] = $prev_error; 

    # evaluate the try block in the correct context 
    if ($wantarray) { 
     @ret = $try->();     # and this is 3) 
    } elsif (defined $wantarray) { 
     $ret[0] = $try->(); 
    } else { 
     $try->(); 
    }; 

    return 1; # properly set $failed to false 
    }; 

最初の警告は、Try :: Tiny自体の実際のsub tryからのものです。


だからあなたは何をすることができますか?警告を非表示にしたくない場合は、コードを少し書き直す必要があります。 tryブロック内にあるlastを取り除き、代わりにdie、または単にreturnで終了させるか、結局のところ、それは関数です。

次に、後で使用して反復をスキップするかどうかを決定する値を設定します。