使用use strict
perl將在不安全的構造上產生運行時錯誤。現在我想知道是否有可能只打印一條警告而不是導致運行時錯誤?或者是use warnings
(或-w)關於相同問題的警告?可以'使用嚴格'警告而不是錯誤
回答
我會在刺激這裏猜測真正的動機。隨意告訴我,如果我猜錯了。
我懷疑你試圖解決一個較大的,較舊的代碼庫,並希望啓用狹隘但你希望先了解錯誤將在哪裏(以及有多少)沒有破壞功能。不幸的是,由於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都沒用。
希望能更接近解決您的實際問題。
謝謝,你的猜測是完全正確的。我現在不能只在這個代碼中允許運行時錯誤,但我最終還是要朝嚴格使用嚴格的方向發展。使用'perl -c'進行檢查已經到位,所以跳過裁判將是第一步。 – Zitrax 2011-03-30 14:11:22
不,use strict
不能發出警告而不是死亡。它所做的只是在魔術$^H
變量中設置一些位,這會在Perl解釋器的內部觸發各種事情。
不,use warnings
不會警告與use strict
殺死您的相同的東西。例如,use warnings
會警告你只能使用一次變量(這可能是錯別字的結果)。
的首選方法:
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
這是如何避免由'使用嚴格'造成的運行時錯誤? – Zitrax 2011-03-30 14:03:25
warnings
的和strict
編譯指示是互補的,不重疊的。 strict
編譯指示具有編譯時和運行時影響。您無法將錯誤的嚴重程度從錯誤降低到警告,但您可以完全禁用它們。例如,如果您正在編寫自己的導出例程,則需要啓用符號引用才能操作符號表。
{
no strict 'refs';
# symrefs okay within this block
}
警告也可以禁用詞彙(假設你沒有use warnings
,而不是主要過時-w
標誌)。
狹窄和警告提供了一個安全網。這就是爲什麼他們被推薦默認使用。如果您禁用它們,您應該只禁用必要的內容,並將更改限制在儘可能小的範圍內。
警告可致命—請參閱perllexwarn —但嚴格的錯誤不能成爲非致命的。
爲什麼你想這樣做?我懷疑是XY問題。
- 1. 使用utf8時不會輸出Perl警告,嚴格錯誤和診斷錯誤
- 2. CS1998引發錯誤而不是警告
- 3. 嚴格使用時是否需要使用警告?
- 4. 使用SLF4J,是否可以對錯誤/警告採取行動?
- 5. Golang測試腳本可以發出警告而不是錯誤嗎?
- 6. 爲什麼使用警告;嚴格使用;在Perl中不是默認的?
- 7. Eclipse的FindBugs插件可能報告錯誤而不是警告嗎?
- 8. 是否有Lua警告而不是Lua錯誤?
- 9. XSD斷言違規是警告而不是錯誤?
- 10. 嚴格使用前有沒有使用警告的理由?
- 11. 使用「嚴格使用」,但仍然得到警告
- 12. Capistrano的錯誤/警告不使用sudo
- 13. 克++嚴格溢出,優化和警告
- 14. 嚴格警告:非靜態方法
- 15. Dokeos警告:嚴格的標準
- 16. php警告和嚴格的標準
- 17. 是否可以在perl中啓用/禁用基於ARGV的嚴格/警告使用?
- 18. 讓Xcode將「可能不會迴應」當作錯誤而不是警告
- 19. TImber錯誤:PHP警告:{{item.permalink}}已棄用,請使用{{item.link}}而不是
- 20. Chrome網上應用店嚴格警告使用公共API
- 21. 不能讓StyleCop錯誤顯示爲構建錯誤(而不是警告)
- 22. 警告錯誤2008不是有效的警告號碼
- 23. 警告爲錯誤,但不是全部
- 24. 只顯示錯誤和信息,而不是警告
- 25. 數據didnt負載,而不是錯誤或警告顯示
- 26. 警告,而不是來自assert_that()的錯誤?
- 27. 顯示Semantic MediaWiki錯誤文本,而不是警告圖標
- 28. 警告(甚至信息消息)而不是Django中的錯誤
- 29. Spring Framework - 顯示警告消息而不是錯誤
- 30. 爲什麼MySQL中有警告而不是錯誤?
你爲什麼需要這個?如果你真的必須使用'no strict;',你可以禁用嚴格的代碼部分。 – 2011-03-25 13:05:59
原因是我正在使用不允許停止的生產關鍵代碼庫。同時,我想在此時解決這些問題。在這種情況下,通過發出警告並檢查完整日誌而不是:*找到中止運行*解決問題*重新運行*等待幾個小時直到在下一期中止時等等,這樣做會更容易... – Zitrax 2011-03-30 13:54:42