in reply to Re^2: 5.10 shows uninitialized $@ warning
in thread 5.10 shows uninitialized $@ warning

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.