在perl中打开文件时使用try / catch或eval进行错误处理

时间:2013-03-01 12:50:42

标签: perl eval perl-module cpan

我编写了简单的代码片段,用于处理在限制打开文件时发生的错误(我们需要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出错:Permission denied

当我使用相同代码的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";

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

2 个答案:

答案 0 :(得分:3)

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+上,您可以使用givenwhen代替此详细代码;有关详细信息,请参阅autodie docs

答案 1 :(得分:1)

操作失败和错误之间存在差异。

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

当代码无法按预期执行时,

eval BLOCKtry...catch用于捕获错误 - 。

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