我习惯于......或者死“......失败...... $!”;。
我很惊讶地发现,为了知道File::Path::remove_tree
是否失败,我必须做这样的事情:
remove_tree( 'foo/bar', 'bar/rat', {error => \my $err} );
if (@$err) {
die "error..."
}
我错过了什么吗?这真的是要走的路吗?
很多不需要的代码......
答案 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::_carp
到File::Path::_croak
的别名之外,我现在不能做任何事情。