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

I don't know where this is documented but die() in DESTROY isn't thrown on my 5.8.7.

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

⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

Replies are listed 'Best First'.
Re^3: Carping in DESTROY.
by ikegami (Patriarch) on Oct 24, 2006 at 18:01 UTC

    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

      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.