2012-11-15 64 views
1

爲什麼Perl不會捕獲這個異常?Perl的eval沒有捕捉異常

my $fh; 
eval { close $fh }; 
warn('Caught') if &@; 

用的輸出:

Can't use an undefined value as a symbol reference at New_test.pl line 30. 

UPDATE:相同的輸出,而不警告線和eval { close $fh };是線30

+2

請向我們顯示*引起此錯誤的實際代碼*。在當代perl中運行您的代碼段並不會產生您所指示的警告。 – pilcrow

+0

好吧,到底是什麼......我將代碼註釋掉了,你是對的,Perl並沒有像所說的那樣失敗。然而,我取消了代碼的註釋,現在它運行正常...... –

回答

6

唯一的例外是不EVAL,其上以下線,&@是錯誤的順序,你的意思是[email protected]

UPD:請注意,關閉可以當你有嚴格和$ fh是undef,我認爲這不是正常情況下(算法錯誤)。

+0

錯誤,至少在5.012關閉將死亡,如果給定一個undef,但是你是正確的&@是不正確的。 –

+0

@EricFossum即時通訊測試Perl 5.14.2和5.8.8'perl -e'$ a = undef;關閉$ a;''不會死亡。 – PSIAlt

+0

我假設你正在運行Linux?我不能使用單引號,但這是我的輸出。 'Z:\> perl -e「使用5.012; my $ a;關閉$ a;」 無法使用未定義的值作爲符號參考在-e行1. Z:\> perl -e「my $ a; close $ a;」 Z:\>' –

0

您應該使用[email protected]而不是&@。 請參考this link看Perl有什麼特殊變量。

[email protected]意味着從最後的eval Perl的語法錯誤或例程錯誤消息,執行-FILE,或需要命令。如果設置,則編譯失敗,或者在eval的代碼中執行die功能。

0

的eval塊確實捕捉異常並防止其致命的。

例如:

#!/usr/bin/perl -Tw 

use strict; 
use warnings; 

my $fh; 
close $fh; 
print "done\n"; 

此程序死亡與預期的消息時,執行關閉。 對於比較:

#!/usr/bin/perl -Tw 

use strict; 
use warnings; 

my $fh; 
eval { close $fh; }; 
print "done\n"; 

這個程序悄悄運行,並在年底執行打印語句。

+0

很好的解釋。 – vgoff