如何检查`File :: Path :: remove_tree`是否失败?

时间:2010-09-24 19:21:33

标签: perl error-handling

我习惯于......或者死“......失败...... $!”;。

我很惊讶地发现,为了知道File::Path::remove_tree是否失败,我必须做这样的事情:

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

我错过了什么吗?这真的是要走的路吗?

很多不需要的代码......

3 个答案:

答案 0 :(得分:3)

remove_tree返回成功删除的文件数,因此需要另一种报告错误的方法而不是返回值。请记住,在遇到错误之前可能已删除了许多文件,因此您不能依赖返回的值为0来表示错误。

这是否是报告错误的方法是一个品味问题。来自文档本身:

  

注意:   以下错误处理机制被认为是实验性的并且可能会发生变化>等待用户反馈。

答案 1 :(得分:1)

我一次删除一条路径,然后检查它是否仍在那里:

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

作为Dancrumb said,您无法信任返回值。

答案 2 :(得分:1)

The docs说它会引发异常:

  

如果make_path或remove_tree遇到错误,将通过carp(非致命错误)或通过croak(致命错误)向STDERR打印诊断消息。

这使我们至少可以对标记为致命的错误使用标准异常处理。

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

警告也可能会以某种方式致命,但除了File::Path::_carpFile::Path::_croak的别名之外,我现在不能做任何事情。