in reply to Re^4: How do I make the garbage collector throw an exception when it fails to auto-close a filehandle?
in thread How do I make the garbage collector throw an exception when it fails to auto-close a filehandle?
You can, of course, adjust the arguments list to make exit() return a failure code to the OS. Unfortunately, that's not going to get caught as an exception, though.#!/usr/bin/perl use strict; use warnings; $| = 1; sub IO::Handle::DESTROY { print "desctructor enter\n"; my $self = shift; close $self or do { warn $!; exit; }; print "destructor exit\n"; } sub something { open ( my $foo, '>', '/dev/full' ); print $foo 'bar'; } print "pre\n"; something(); print "post\n";
You can make the END block do whatever you need it to do to complain/cleanup. Just put use Foo; at the top of your program, and any failed file close triggers exit and what ever's in your END block. For that matter, since setting IO::Handle::DESTROY in the module seems to work pretty well, you could just put your cleanup code in there, too.package Foo; my $error; END { warn $error if $error; } sub IO::Handle::DESTROY { print "desctructor enter\n"; my $self = shift; close $self || do { $error = $!; exit; }; print "destructor exit\n"; } 1;
|
|---|