1

我编写了简单的代码片段,以处理在受限(我们需要 root 权限)中打开文件时发生的错误,以下代码工作正常并给出错误为 o/p

#!/usr/bin/perl

use strict;
use warnings;
use Try::Tiny;

my $file_name = "/var/log/test.txt"; # needs root permission to create file

if(open(HAN, ">$file_name")){
    print "sucuessfully opened file \n ";
} else {
    print "Error with if/else while openning file : $! \n";
}

o/p:

打开文件时 if/else 出错:权限被拒绝

当我使用相同代码的 try/catch 或 eval 并打开文件时

try {
    open(HAN, ">$file_name");
} catch {
    print "Error with try/catch while opening file : $_ \n";
};

或者

eval {
    open(HAN, ">$file_name");
};
print " Error with eval while opening file : $@ \n";

它在 $_ 或 $@ 中没有显示输出,为什么会这样?

4

2 回答 2

4

如果失败, open不会抛出异常,它返回一个 false 值并将错误存储在$!. 因此,典型用法是

open my $fh, '>', $filename or die "Couldn't open '$filename' for writing: $!";

如果您有很多 I/O 代码或其他可能引发异常的东西,您可能更喜欢open(和其他 I/O 函数)在失败时自动抛出错误。你可以用autodie做到这一点:

use autodie qw(:io);

正如@sputnick 提到的,你应该use warnings;除了use strict;

最后,这是一个仅捕获 I/O 异常的示例:

use warnings;
use strict;
use autodie qw(:io);
use Try::Tiny;

try {
    open my $fh, '>', $filename;
    ... more code ...
}
catch {
    if ($_->isa('autodie::exception') && $_->matches(':io')) {
         print "Error doing something with '$filename': $_\n";
    }
    else {
         die $_;  # rethrow
    }
};

在 Perl 5.10+ 上,您可以使用givenandwhen代替这个冗长的代码;有关更多信息,请参阅autodie 文档

于 2013-03-01T13:03:31.523 回答
1

操作失败和错误之间是有区别的。

当您尝试打开一个不存在的文件(或其他文件)时,该open函数无法成功打开该文件。但这并不意味着open. open行为完全符合预期:当文件无法打开时返回错误值。

eval BLOCK并且try...catch用于捕获错误——代码无法按预期执行的情况。

无法打开文件可能是您的代码错误——如果您无法打开某个文件,您的代码可能无法按预期执行。在这种情况下,您可以处理此问题并输出错误。

于 2013-03-01T13:12:38.063 回答