Perl 如果打开文件失败,是否必须使用die?

Perl 如果打开文件失败,是否必须使用die?,perl,Perl,大多数时候,我都会这样做: open FH, ">file.txt" or die "Cann't open file: $!"; 是否必须使用模具?如果我希望脚本继续运行(如果无法打开文件,只需忽略错误),我该怎么办?您可以使用try::Tiny或类似的方法使用try catch块。如果无法访问文件,代码不必死 如果写入文件是可选的,则可以执行以下操作: my $file_is_ok = 0; open FH, ">file.txt" and $file_is_ok = 1; w

大多数时候,我都会这样做:

open FH, ">file.txt" or die "Cann't open file: $!";

是否必须使用
模具
?如果我希望脚本继续运行(如果无法打开文件,只需忽略错误),我该怎么办?

您可以使用try::Tiny或类似的方法使用try catch块。

如果无法访问文件,代码不必死

如果写入文件是可选的,则可以执行以下操作:

my $file_is_ok = 0;
open FH, ">file.txt" and $file_is_ok = 1;
warn "No logging available" unless $file_is_ok;
然后,无论您想在何处使用文件句柄,都可以首先检查它是否正常:

$file_is_ok and print FH "Something happened";

通常情况下,您需要比上述内容多一点抽象,但我希望这就足够开始了。

不,
die
基本上不需要使用,否则一个失败的
open
将直接退出程序。这只是一个常用的构造,因为如果无法打开文件,通常没有必要继续,但实际上也不需要
死亡
或执行任何其他操作

您可能想做以下事情

if(open my $fh, ">", "file.txt") {
    # do stuff with file
    close $fh;
}
else {
    # do stuff without file
} 

我可能会这样做:

sub process_file {
    my $file = shift;
    open(my $fh, ">", $file) or return;
    # write to file ...
}

建议您使用
Carp
中的
croak()
,尤其是在模块或对象中。看


Carp
是一个标准模块,与所有标准模块一样,它随Perl一起安装。
perlmodlib
中提供的所有标准模块的列表。请参见

如果您试图避免在打开文件时遇到错误而退出程序,则省略
模具
不是正确的方法
die
是Perl的异常机制;它在默认情况下中止程序这一事实是偶然的,而不是根本性的。如果提供异常处理程序,则保留控制权。正确的方法是捕获异常并在
finally
块中进行清理

use 5.10.0;
use Try::Tiny;

my ($infile, $FH);
try {
    open $infile, '<', 'infile.txt' or die "Can't open infile";
    try { 
        open $FH, '>', 'file.txt'   or die "Can't open outfile";
        my $line = <$infile>;
        print $FH $line;
        say 'Cleaning up $FH';
        close $FH;
    } finally {
        say 'Cleaning up $infile';
        close $infile;
    } catch {
        die $_;
    };
} catch {
    die $_;
};
使用5.10.0;
使用Try::Tiny;
我的($infle,$FH);
试一试{

打开$infle,“很抱歉回答了几个月前的问题,但我这样做的方式是实现我自己的
die
风格的子例程:

sub fail {
    my $text = $_[0];

    # Do error-related stuff here, like send an email
    die($text) # or just exit
}

open(my $fh, ">file.txt") or fail("Unable to open file: $!");

虽然我没有-1,但在我看来这是一个评论,不是一个答案……听起来有点像蟒蛇,不是perlis……我也没有-1,但OP希望忽略错误,并打开()默认情况下不会死亡,所以这甚至不是一个答案,除非OP使用autodie,如果他想忽略错误,这将是愚蠢的。@deathapril您是对的,假设这是1998年,这不是perlish。否则,我使用goto(例如goto Exit;并且在脚本的末尾,Exit:Exit(-1);)对我有好处吗?@ericyoung-不。不,不是。如果你假装Perl没有实现
goto
,你会过得好得多。你可以随时打开(my$fh,“>”,“file.txt”)或退出(-1)
@JackManey:事实上,这并不是严格意义上的事实。
goto&SUB
版本的
goto
非常有用:-)@ericyoung等等。所以你的问题是如何避免抛出异常,这样你就可以重新实现异常?你真的在问如何使它不会使
die
中止程序吗?@ericyoung Th这是对我所说内容的重申,正确答案是“抓住例外情况”。请不要使用裸字
FH
或2参数方式打开。始终使用
打开我的$FH,“>”,“file.txt”
。因为裸字是全局性的,所以更安全。也可以使用打开方式(读取、追加、写入……)。当您使用变量作为文件名时,它可能会以不可靠、可疑的内容开头(如管道…=)。请不要做出这样的笼统陈述。他在许多情况下做得非常好。@tchrist:但是,词法文件与
open
的三参数形式一起处理“非常好”在更多的情况下,它没有缺点。将它作为一种标准做法是常识,而你批评试图传播它的行为是有害的。
sub fail {
    my $text = $_[0];

    # Do error-related stuff here, like send an email
    die($text) # or just exit
}

open(my $fh, ">file.txt") or fail("Unable to open file: $!");