2013-03-01 170 views
1

我编写了简单的代码片段,用于处理在受限制的(我们需要root权限的情况下)打开文件时发生的错误 以下代码工作正常并且出现错误作为O/p在perl中打开文件时使用try/catch或eval进行错误处理

#!/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 : [email protected] \n"; 

它显示在$无输出_或$ @,这是为什么happing?

+0

总是把'使用警告' – 2013-03-01 13:01:43

+1

通常使用的语法是使用open()或死“$!”; – run 2013-03-01 13:06:21

+0

@ run-thanks,我知道我们可以使用“$!”对于open(),但试图探索用try..catch或eval来做到这一点。 – Ganesh 2013-03-01 13:50:57

回答

3

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

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了解更多信息。

+0

@ rjh-感谢您的详细解释。 – Ganesh 2013-03-01 13:47:53

+0

+1表示'autodie'可能会做他所期望的。 – darch 2013-03-02 00:36:49

1

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

当您尝试打开不存在的文件(或其他)时,open函数未能成功打开该文件。但这并不意味着在open中有错误。 open的行为与它的意图完全相同:无法打开文件时返回错误值。

eval BLOCKtry...catch用于捕获错误 - 代码无法按预期执行时的情况。

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