在perl中打开文件时使用try/catch或eval处理错误
我编写了一些简单的代码片段,用于处理在受限(需要root权限)中打开文件时发生的错误 下面的代码工作正常,并给出一个o/p错误在perl中打开文件时使用try/catch或eval处理错误,perl,eval,perl-module,cpan,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 "sucues
#!/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";
};
或
它在$\或$@中没有显示输出,为什么会出现这种情况?如果失败则不会引发异常,它返回一个假值,错误存储在$中代码>。因此,典型用法是
open my $fh, '>', $filename or die "Couldn't open '$filename' for writing: $!";
如果您有大量的I/O代码或其他可能引发异常的东西,那么您可能更希望open
(和其他I/O函数)在出现故障时自动引发错误。您可以通过以下方式执行此操作:
正如@sputnick提到的,您应该使用警告代码>除使用严格外代码>
最后,以下是仅捕获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
来代替这个冗长的代码;有关详细信息,请参阅。如果失败,则不会引发异常,它返回一个假值,错误存储在$中代码>。因此,典型用法是
open my $fh, '>', $filename or die "Couldn't open '$filename' for writing: $!";
如果您有大量的I/O代码或其他可能引发异常的东西,那么您可能更希望open
(和其他I/O函数)在出现故障时自动引发错误。您可以通过以下方式执行此操作:
正如@sputnick提到的,您应该使用警告代码>除使用严格外代码>
最后,以下是仅捕获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
来代替这个冗长的代码;有关更多信息,请参阅。操作失败和错误之间有区别
当您试图打开一个不存在的文件(或任何文件)时,open
函数无法成功打开该文件。但这并不意味着open
中有错误<代码>打开
的行为与预期的完全一致:无法打开文件时返回假值
eval BLOCK
和try…catch
用于捕获代码无法按预期执行时的错误情况
无法打开文件可能是与代码相关的错误。如果无法打开特定文件,则代码可能无法按预期执行。在这种情况下,您可以处理此问题并输出错误 操作失败和错误之间有区别
当您试图打开一个不存在的文件(或任何文件)时,open
函数无法成功打开该文件。但这并不意味着open
中有错误<代码>打开
的行为与预期的完全一致:无法打开文件时返回假值
eval BLOCK
和try…catch
用于捕获代码无法按预期执行时的错误情况
无法打开文件可能是与代码相关的错误。如果无法打开特定文件,则代码可能无法按预期执行。在这种情况下,您可以处理此问题并输出错误 始终放置使用警告
众所周知的语法是使用open()或die“$!”@运行谢谢,我知道我们可以使用“$!”来表示open(),但我们正在尝试使用try..catch或eval来探索实现这一点的方法。始终放置use warnings
us众所周知的语法是使用open()或die“$!”@运行谢谢,我知道我们可以使用“$!”来表示open(),但我们正在尝试使用try..catch或eval来探索实现此功能的方法。@rjh感谢您的详细解释。@rjh感谢您的详细解释。