假设我有一个必须释放的资源(例如文件句柄或网络套接字):
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 方法可以确保即使在存在异常的情况下也能像这样自动释放资源?还是显式错误检查是唯一的选择?