2013-06-11 49 views
5

這個腳本:爲什麼不使用警告FATAL =>'all'似乎有效?

use warnings FATAL => 'all'; 

warn 'warning'; 
die 'death'; 

...結果在「警告」得到記錄,但在這一點上並沒有死,而是與「死」死亡。

我有一個mod_perl模塊,覆蓋$main::SIG{__DIE__}基本吐出die()消息到瀏覽器在開發過程中,但它不碰SIG{__WARN__},所以這裏發生了什麼?

這是在Windows Server 2003上的Perl 5.10.1,在PerlSwitches 「-w」。

回答

8

你誤解了warnings pragma的目的。它在那裏發出完全合法的警告信息,但可能是錯誤的操作。例如:

use warnings; 
my ($x, $y) = ("hello", "world"); 
say "same" if $x == $y; 

Argument "world" isn't numeric…。我們可以讓某些類別的產生致命錯誤與use warnings FATAL => $CATEGORY與類別,如numericuninitializedall類別代表所有類別。

不會將每個warn的語義改爲die。你可以自己做,例如與重寫一個local $SIG{__WARN__},或者創建一個warn函數,它croak @_。您甚至可以覆蓋CORE::GLOBAL::warn以更改所有warn,即使它們位於其他模塊中。

CGI::Carp該模塊具有warningsToBrowser選項;你可能想看看源代碼,看看它是如何實現的。

9

它不似乎工作,因爲你的測試是不是測試你要測試的。試試這個:

use warnings FATAL => 'all'; 

print undef; 
die 'death'; 

正如no warnings不會阻止warn從工作,warnings FATAL不會讓warn模具。

相關問題