以下代码(一个简化的示例,我实际上是在遍历对象列表并尝试捕获异常)通过转到 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
我可以看到解决它的两种方法——在这个用法的范围内关闭警告,使用范围内的无警告块,或者将错误消息复制到一个临时变量并在 catch 块之外检查它/下一个。前者可能有我忽略的问题,而后者则稍微扩展了错误处理。哪个是首选,还是我忽略了另一种方式?