我完全困惑。這裏是我的代碼:爲什麼兩個分支似乎都執行?
use strict;
use warnings;
use Test::More;
subtest 'huh?' => sub {
my $i = 0;
eval {
$i++;
} || do {
$i++;
};
is($i, 1, "only execute one branch (i: $i)");
};
&done_testing();
這是我的測試輸出(用時5.12的activeperl運行的Mac OS X):
not ok 1 - only execute one branch (i: 2)
# Failed test 'only execute one branch (i: 2)'
# at test.pl line 14.
# got: '2'
# expected: '1'
1..1
# Looks like you failed 1 test of 1.
not ok 1 - huh?
# Failed test 'huh?'
# at test.pl line 15.
1..1
# Looks like you failed 1 test of 1.
這到底是怎麼回事?我預計只有第一個分支才能運行,因爲沒有任何die
s。但它看起來像兩個分支都被執行。
啊...所以當我使用'eval'來捕獲異常時,我應該始終確保它返回一個真值,以免在'eval'內部拋出異常? – 2012-03-14 20:09:20
@MattFenwick,如果你打算用'||'或者'or'測試返回,那麼是的。我要更新我的答案。 – Axeman 2012-03-14 20:12:03
如果你在修正bug之前運行一個perl版本,'if $ $'語句有機會運行之前'$ @'可以在'DESTROY'塊中清除。 'eval {...; 1}或呱呱叫......'不會受到這個錯誤的影響。 – 2012-03-14 21:47:22