Скажем, у меня есть ресурс (например, файловый дескриптор или сетевой сокет), который должен быть освобожден:
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, обеспечивающий автоматическое освобождение ресурсов, как это, даже при наличии исключений?Или явная ошибка проверки единственной опции?