2011-03-25 37 views
4

使用use strict perl將在不安全的構造上產生運行時錯誤。現在我想知道是否有可能只打印一條警告而不是導致運行時錯誤?或者是use warnings(或-w)關於相同問題的警告?可以'使用嚴格'警告而不是錯誤

+5

你爲什麼需要這個?如果你真的必須使用'no strict;',你可以禁用嚴格的代碼部分。 – 2011-03-25 13:05:59

+0

原因是我正在使用不允許停止的生產關鍵代碼庫。同時,我想在此時解決這些問題。在這種情況下,通過發出警告並檢查完整日誌而不是:*找到中止運行*解決問題*重新運行*等待幾個小時直到在下一期中止時等等,這樣做會更容易... – Zitrax 2011-03-30 13:54:42

回答

4

我會在刺激這裏猜測真正的動機。隨意告訴我,如果我猜錯了。

我懷疑你試圖解決一個較大的,較舊的代碼庫,並希望啓用狹隘但你希望先了解錯誤將在哪裏(以及有多少)沒有破壞功能。不幸的是,由於use strict的功能是通過修改perl分析器和解釋器的內部行爲,因此不存在「寬鬆嚴格」或類似於html的任何類型的「過渡」模式。

但是,您可以取笑use strict的功能以開始向正確的方向移動。首先,請注意,實際上有三個獨立的部分:

use strict 'refs'; # no symbolic references 
use strict 'vars'; # must declare variables 
use strict 'subs'; # no barewords 

,其中只有「裁判」的生成運行時錯誤。因此,您可以輕鬆地將use strict qw(vars subs)添加到您的每個文件(腳本和模塊)並使用perl -c進行測試。如果您遇到任何錯誤消息,請註釋掉use strict,或者至少兩個檢查中的任何一個失敗,並添加關於失敗的性質的評論並繼續。通過這種方式,您可以快速(取決於文件數量)確定哪些文件具有編譯時錯誤並稍後回來解決它們。 (如果你現在比我更有動力,你甚至可以自動化這個過程)。除非你有代碼在BEGIN塊中做可怕的事情,否則這應該是相當安全的。

更復雜的部分是檢查由use strict 'refs'生成的運行時錯誤,不幸的是,確實不是一個簡單的方法來做到這一點,因爲錯誤是由符號引用觸發的,而這些符號引用不能通過任何靜態分析所以-c和/或Perl::Critic都沒用。

希望能更接近解決您的實際問題。

+0

謝謝,你的猜測是完全正確的。我現在不能只在這個代碼中允許運行時錯誤,但我最終還是要朝嚴格使用嚴格的方向發展。使用'perl -c'進行檢查已經到位,所以跳過裁判將是第一步。 – Zitrax 2011-03-30 14:11:22

14

不,use strict不能發出警告而不是死亡。它所做的只是在魔術$^H變量中設置一些位,這會在Perl解釋器的內部觸發各種事情。

不,use warnings不會警告與use strict殺死您的相同的東西。例如,use warnings會警告你只能使用一次變量(這可能是錯別字的結果)。

3

的首選方法:

use Carp; 

sub foo { 
    croak "no args" unless @_; 
} 

eval foo(); 
if([email protected]){ 
    print "caught die: [email protected]"; 
} 

如果你不能改變你的die年代到croak的:

sub foo { 
    die "no args" unless @_; 
} 

{ 
    my $prev_die = $SIG{__DIE__}; 
    $SIG{__DIE__} = sub { print "caught die: $_[0]"; }; 
    eval foo(); 
    $SIG{__DIE__} = $prev_die; 
} 

第二種方法將打印出STDERR上的錯誤。

參見:

perldoc -f eval

perldoc perlvar並搜索/\$\@//__DIE__/

perldoc Carp

+0

這是如何避免由'使用嚴格'造成的運行時錯誤? – Zitrax 2011-03-30 14:03:25

4

warnings的和strict編譯指示是互補的,不重疊的。 strict編譯指示具有編譯時和運行時影響。您無法將錯誤的嚴重程度從錯誤降低到警告,但您可以完全禁用它們。例如,如果您正在編寫自己的導出例程,則需要啓用符號引用才能操作符號表。

{ 
    no strict 'refs'; 
    # symrefs okay within this block 
} 

警告也可以禁用詞彙(假設你沒有use warnings,而不是主要過時-w標誌)。

狹窄和警告提供了一個安全網。這就是爲什麼他們被推薦默認使用。如果您禁用它們,您應該只禁用必要的內容,並將更改限制在儘可能小的範圍內。

1

警告可致命—請參閱perllexwarn —但嚴格的錯誤不能成爲非致命的。

爲什麼你想這樣做?我懷疑是XY問題。

+0

在主要問題下查看評論;基本上我想慢慢遷移到嚴格使用。允許當前代碼立即中止這些嚴格的錯誤不是一種選擇。 – Zitrax 2011-03-30 14:05:51

+0

@Zitrax,然後慢慢添加'use strict;'(或者慢慢刪除'no strict;')。忽略警告沒有好處。 – ikegami 2011-03-30 18:39:31

相關問題