我编写了简单的代码片段,用于处理在限制打开文件时发生的错误(我们需要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";
它在$ _或$ @中没有显示输出,为什么会这样?
答案 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+上,您可以使用given
和when
代替此详细代码;有关详细信息,请参阅autodie docs。
答案 1 :(得分:1)
操作失败和错误之间存在差异。
当您尝试打开不存在的文件(或其他)时,open
函数无法成功打开文件。但这并不意味着open
中存在错误。 open
的行为完全符合预期:在无法打开文件时返回false值。
eval BLOCK
和try...catch
用于捕获错误 - 。
无法打开文件可能是您的代码的错误 - 如果您无法打开某个文件,您的代码可能无法按预期执行。在这种情况下,您可以处理此问题并输出错误。