2010-11-08 45 views
1

我有一條線類似於以下配置perl的更嚴格的文件IO錯誤

my $in = new IO::File ($fn) 
    or warn "Sorry, there was a problem opening $fn: $!\n", 
    and return; 

在我的系統如果由$fn指定的文件路徑不存在一個perl腳本,它會顯示警告並從該函數返回。

一個系統,但是,它正在打印標準could not open {file path}: No such file or directory並退出腳本而不是打印我提供的報警並返回。

我已將代碼更改爲更具防禦性,在打開它之前檢查文件是否存在。然而,瞭解這種差異的原因是很有用的,這樣我可以在未來正確地測試我的代碼,而無需發佈並等待錯誤報告。

是否有一些針對perl的配置,當文件不存在等錯誤發生時,它會更加嚴格?

+0

我不假設某人在使用Acme :: use :: strict :: with :: pride;時將某個其他文件隱藏,不看,是嗎? :) – Ether 2010-11-08 16:58:07

+1

這看起來沒有語法上的有效性。有沒有理由你沒有使用更清晰的語法,如:'除非(我的$ input_handle = IO :: File-> new($ filename)){警告「不能IO :: File-> new($ filename) :$!「;返回; }'?另外爲什麼你不只是調用'open'而不是在所有模塊垃圾中彈跳? – tchrist 2010-11-08 16:59:51

回答

2

由於它不打印您的警告,因此它必須是die-早些時候。除非使用Fatal(現已棄用爲接口)或autodie(首選接口)等模塊,否則Perl通常不會因IO錯誤而死亡。

所以,你可以看收錄的autodieFatal模塊,以及在當前運行時:

say "Fatal included from : $INC{'Fatal.pm'}"; 

注:首選autodie包括Fatal,所以它們中的一個檢查。

當然,中找出的更完整的方法之一它是什麼做的是使用

perl -d /path/to/io_script_dying_on_me.pl 

,並通過IO ::文件::新呼叫步驟 - 然而,一些Perl模塊當調試器被檢測到時,行爲會有所不同


如果它印在你的消息,有人可能已經覆蓋了警告warn就警告死。他們可以通過更改警告處理程序($SIG{__WARN__})或通過在CORE::GLOBAL命名空間中安裝不同的定義來完成此操作。您可以檢查以下內容:

use Data::Dumper; 
$Data::Dumper::Deparse = 1; 

say Data::Dumper->Dump([ $SIG{__WARN__} ], [ '$SIG{__WARN__}' ]); 
say Data::Dumper->Dump([ \&CORE::GLOBAL::warn ], [ '*CORE::GLOBAL::warn' ]); 
+0

其實它不會打印我指定的警告。我編輯了這篇文章,使其更清晰。 – ICR 2010-11-08 16:57:40