9

大多数时候,我会做这样的事情:

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

die一定要使用吗?如果我希望我的脚本继续运行(如果文件无法打开则忽略错误),我应该怎么做?

4

9 回答 9

22

你可能想做类似的事情

if(open my $fh, ">", "file.txt") {
    # do stuff with file
    close $fh;
}
else {
    # do stuff without file
} 
于 2013-06-25T20:11:51.823 回答
8

如果代码die无法访问文件,则不必这样做。

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

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";

通常你会想要比上面更多的抽象,但我希望这足以开始。

于 2013-06-25T20:09:57.907 回答
5

不,die绝对不必使用,否则失败open只会退出程序。这只是一个常用的结构,因为通常如果您无法打开文件,则继续没有意义,但实际上也不需要die或做任何其他事情。

于 2013-06-25T20:11:00.803 回答
1

我可能会做类似的事情:

sub process_file {
    my $file = shift;
    open(my $fh, ">", $file) or return;
    # write to file ...
}
于 2013-06-25T21:15:28.473 回答
1
open(my $fh, ">", $file) or print "open failed , you are on your own\n";
于 2013-06-26T05:02:24.610 回答
0

建议您改用croak()from Carp,尤其是在模块或对象中。见http://perldoc.perl.org/Carp.html

Carp是一个标准模块,与所有标准模块一样,随 Perl 一起安装。所有标准模块的列表可在perlmodlib. 请参阅http://perldoc.perl.org/perlmodlib.html

于 2013-06-25T22:29:23.413 回答
0

很抱歉回答了几个月前的问题,但我这样做的方式是实现我自己的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: $!");
于 2013-09-12T15:30:53.457 回答
-1

您可以使用 try catch 块,使用 Try::Tiny 或类似的东西。

于 2013-06-25T20:06:55.170 回答
-1

如果您尝试做的是避免在打开文件时遇到错误时退出程序,那么省略die不是正确的方法。 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 $_;
};

因此,如果open $infile ...失败,则die转到catch块,该块将重新执行并中止脚本。但是一旦我们打开了$infile,如果open $FH失败,就会死在一个 catch 块中,该块也会中止程序,但会强制close $infile先发生。文件句柄不是在程序退出之前清理资源的最佳示例,因为解释器会自动关闭文件,但基本思想就在那里。

如果您不喜欢嵌套try块,您可以通过检查哪个异常导致块中止并根据此决定需要进行哪些清理来实现非常相似的效果。这比任何提到的都更脆弱,但仍然更强大goto

于 2013-06-27T23:10:50.503 回答