次のコード (簡略化された例、実際にはオブジェクトのリストを繰り返し処理し、例外をトラップしようとしています) は、for リストの次の項目に移動してエラー処理を実行します。これは機能しますが、catch サブルーチン内でループ制御ステートメントを使用すると警告が表示されます。
use strict;
use warnings;
use Try::Tiny;
use 5.010;
NUM: for my $num (1 .. 10) {
try {
if ($num == 7) {
die 'ugly number';
}
} catch {
chomp;
say qq/got "$_"/;
next NUM;
};
say qq/number $num/;
}
出力:
number 1
number 2
number 3
number 4
number 5
number 6
got "ugly number at testtry.pl line 9."
Exiting subroutine via next at testtry.pl line 14.
Exiting subroutine via next at testtry.pl line 14.
number 8
number 9
number 10
これを回避する方法は 2 つあります。この使用法の範囲内で、範囲指定された警告なしブロックを使用して警告を閉じるか、エラー メッセージを一時変数にコピーして、catch ブロックの外側で /next をチェックします。前者には私が見落としている問題がある可能性があり、2 番目にはエラー処理が少し広がります。どちらが優先されますか、または私が見落としている別の方法はありますか?