2010-09-24 30 views
1

我習慣於......或者死亡......失敗...... $!「;.如何檢查`File :: Path :: remove_tree`是否失敗?

我驚訝地發現,爲了知道是否File::Path::remove_tree失敗與否,我必須做這樣的事情:

remove_tree('foo/bar', 'bar/rat', {error => \my $err}); 
if (@$err) { 
die "error..." 
} 

我缺少的東西?這真的是要走的路嗎?

很多不必要的代碼,我...

回答

3

remove_tree返回成功刪除的文件的數量,因此它需要比報告返回值的誤差的另一種方法。請記住,在遇到錯誤之前可能會刪除大量文件,因此您不能依賴返回的值爲0來指示錯誤。

這是否是報道錯誤的方式是一個品味問題。從文檔本身:

注意: 以下錯誤處理機制被認爲是實驗性的,可能會發生更改>等待用戶反饋。

+3

換句話說「如果你有更好的主意,我全都是耳朵!」 – Ether 2010-09-24 19:38:02

1

我刪除一條路徑在一個時間,然後檢查是否仍然存在之後:

foreach my $path (@paths) { 
     my $rc = remove_tree($path, { ... }); 
     die ... if -e $path; 
     } 

由於Dancrumb said,你不能相信的返回值。

+0

+1是的,我知道這裏的返回值無關緊要。我只是想知道,如果這種失敗測試是如此「苛刻」的共同點。 – 2010-09-24 20:00:42

+0

當我處理系統並且很重要時,這就是我所做的。這不是那麼苛刻。 – 2010-09-24 20:01:42

1

The docs說,它提出了例外:

如果make_path或remove_tree經由鯉魚遇到錯誤,診斷消息將被打印到STDERR(對於非致命錯誤),或經由叫聲(致命錯誤)。

這使我們能夠使用標準異常處理,至少對於標有致命錯誤的錯誤。

use Try::Tiny; 
try { 
    … remove_tree … 
} catch { 
    warn "remove_tree failed: $_"; 
}; 

的警告可以以某種方式fatalised,太多,但我做不到的像樣的東西,現在除了走樣File::Path::_carpFile::Path::_croak