in reply to Re^2: Carping in DESTROY.
in thread Carping in DESTROY.

It does get thrown — anything after the die won't get executed — but it's intercepted by DESTROY's caller.

my $var = 1; sub A::DESTROY { $var = 2; die 'ok'; $var = 3; } my $obj = bless [], 'A'; $obj = ''; # no exception occurs print "$var\n"; # 2 print "$@\n"; # " (in cleanup) ok at - line 1."

This behaviour isn't new. Tested with 5.6.1

Replies are listed 'Best First'.
Re^4: Carping in DESTROY.
by eff_i_g (Curate) on Oct 24, 2006 at 19:10 UTC
    Actually, my eval try was in erorr. This is giving me what I want:
    sub DESTROY { my $self = shift; eval { store $self, DATA_FILE }; die $@ if $@; }
    I partially understand this. This is what Storable is doing:
    ... sub logcroak { Carp::croak(@_); } ... open(FILE, ">$file") || logcroak "can't create $file: $!"; ...
    I'm still a little confused why I have to capture the croak and then die, as opposed to letting it croak.
      croak does something with caller(). DESTROY doesn't have a caller() (that croak recognises). If you do a sub or eval that does provide a caller() that croak recognises and so does the right thing.
        Ah ha! Thank you very much!