when I understand it correctly
{ package Foo; sub new { bless({}, $_[0]) } DESTROY { eval { die "Woof\n"; }; } } eval { my $foo = Foo->new(); die "Meow\n"; }; print($@); # Woof
I would recommend the use of eval in a destructor as not so good practice.
There's no alternative. The bad practice is relying on $@ telling you if an exception occurred or not.
But the handler in general are not the problem
If that's true, you wouldn't have to add local $SIG{'__DIE__'} = sub { die $@ }; in every eval. Seeing as you don't control all the evals in your program, a better solution to your initial problem (your handler misbehaving when you are in an eval) is to check $^S in the global handler
but this produces the warning in 5.8 too. So I do not really know what introduces the real problem.
As it should. The local $@; restores $@ to its previous value (undef) once the scope in which local $@; resides is exited (no matter how its exited).
$@=undef; { local $@; ... } # $@ is undef here, no matter what "..." is.
In reply to Re^3: 5.10 shows uninitialized $@ warning
by ikegami
in thread 5.10 shows uninitialized $@ warning
by pmSwim
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |