解放する必要のあるリソース (ファイルハンドルやネットワークソケットなど) があるとします。
open my $fh, "<", "filename" or die "Couldn't open filename: $!";
process($fh);
close $fh or die "Couldn't close filename: $!";
それprocess
が死ぬかもしれないとしましょう。その後、コード ブロックは早期に終了し、$fh
閉じられません。
エラーを明示的にチェックできます。
open my $fh, "<", "filename" or die "Couldn't open filename: $!";
eval {process($fh)};
my $saved_error = $@;
close $fh or die "Couldn't close filename: $!";
die $saved_error if $saved_error;
しかし、この種のコードは正しく作成するのが難しいことで有名であり、リソースを追加するとさらに複雑になります。
C++ では、 RAIIを使用して、リソースを所有し、そのデストラクタがそれを解放するオブジェクトを作成します。そうすれば、リソースを解放することを覚えておく必要がなくなり、例外がスローされた場合でも、RAII オブジェクトが範囲外になるとすぐにリソースのクリーンアップが正しく行われます。残念ながら、Perl ではDESTROY
メソッドが呼び出されるタイミングが保証されていないため、メソッドはこの目的には適していません。
例外が存在する場合でも、このようにリソースが自動的に解放されるようにする Perlish の方法はありますか? それとも明示的なエラーチェックが唯一のオプションですか?