ほとんどの場合、私は次のようなことをします。
open FH, ">file.txt" or die "Cann't open file: $!";
die
使用する必要がありますか?スクリプトを続行したい場合 (ファイルを開けない場合はエラーを無視したい場合)、どうすればよいですか?
ほとんどの場合、私は次のようなことをします。
open FH, ">file.txt" or die "Cann't open file: $!";
die
使用する必要がありますか?スクリプトを続行したい場合 (ファイルを開けない場合はエラーを無視したい場合)、どうすればよいですか?
You might want to do something like
if(open my $fh, ">", "file.txt") {
# do stuff with file
close $fh;
}
else {
# do stuff without file
}
数か月前の質問に回答して申し訳ありませんが、これを行う方法は、独自の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: $!");
Try::Tiny などを使用して、try catch ブロックを使用できます。
ファイルを開くときにエラーが発生したときにプログラムを終了しないようにすることを目的としている場合、 を省略すること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
は、プログラムを中止するが強制的close $infile
に最初に発生させる catch ブロックに死ぬ。ファイル ハンドルは、インタープリターがファイルを自動的に閉じるため、プログラムの終了前にクリーンアップするリソースの最適な例ではありませんが、基本的な考え方はそこにあります。
ネストされたブロックが気に入らない場合はtry
、どの例外がブロックを中止させたかを確認し、それに基づいてどのようなクリーンアップが必要かを判断することで、非常によく似た効果を得ることができます。それはもう少し壊れやすいですが、言及されている何よりも堅牢ですgoto
。