# from Michael G Schwern
# on Monday 26 February 2007 03:29 pm:
>Eric Wilhelm wrote:
>> # from Michael G Schwern
>>
>> # on Monday 26 February 2007 01:50 pm:
>>> And then someone defined a $SIG{__DIE__} so now its C<<{ local
>>> $SIG{__DIE__}; eval { $obj->isa($class) } }>>
>>
>> No. If that $SIG{__DIE__} doesn't check $^S, then it's just
>> delete($SIG{__DIE__}) and you're back to eval {$obj->isa($class)}
>> and balance is restored.
>
>You don't want to delete someone else's $SIG{__DIE__}.
No, I do. Why would anyone else's $SIG{__DIE__} be in my code? Now,
maybe you're going to say that someone might use my module and be upset
because their broken $SIG{__DIE__} is broken.
>And how can
> you know if it checks $^S (most don't)?
Maybe some juggling of exit and die. Hmm, sounds like a job for
chromatic. Acme::OhNoYouDidn::t? Or, you could just curry it into a
sub that does check $^S if you wanted to be safe and weren't concerned
about the call stack. Or you could always just walk down the hall and
tell whoever wrote it to fix it.
> Or was that a round-about
> way to say "you should always check $^S in your $SIG{__DIE__}"
Yeah. No, I don't actually delete it. But if you're having problems,
delete() may well be the answer.
> which
> would be great but nobody does which brings me right back to "it
> shouldn't be so hard to do it right!"
Why doesn't anybody do it right? Yes, the docs say that it was an
accident that $SIG{__DIE__} gets called from within an eval and "that
may be fixed in the future." But, it's very clear in both perlvar and
perlfunc#die, so why bother with the eval {local $SIG{__DIE__}; ...}
mess? Just cause broken code to break instead of working around it.
--Eric
--
Anyone who has the power to make you believe absurdities has the power
to make you commit injustices.
--Voltaire
---------------------------------------------------
http://scratchcomputing.com
---------------------------------------------------