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

在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

我编写了一些简单的代码片段,用于处理在受限(需要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";
};

它在$\或$@中没有显示输出,为什么会出现这种情况?

如果失败则不会引发异常,它返回一个假值,错误存储在
$中。因此,典型用法是

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感谢您的详细解释。