At work I'm writing a large application. It uses an in-house logging module. That installs, amongst other things, a __DIE__ handler so we can log errors with a stack trace and all sorts of other goodness before exiting.
The front-end is a CGI script which uses the Template Toolkit. Some templates mysteriously logged stuff and stopped, muttering about us not having some Apache::* module installed. We tracked this down to TT trying to use the module in an eval.
Dear module authors, if you're going to eval stuff because you expect it to die, be aware that __DIE__ handlers *are* called when stuff dies in an eval. Please temporarily remove the __DIE__ handler before doing your voodoo, and then restore it.
And just to prove it ...
perl -e '$SIG{__DIE__} = sub { print "Foo\n"; exit(1); }; eval "use Apache::NonExistent;"; print "Bar" if $@'
(caller(0))[3] eq '(eval)'. You'll get caught out by such things as HTML::Parser otherwise.
Re:Check caller
Juerd on 2003-11-20T18:42:31
I find using $^S much easier.See also perlvar.$SIG{__DIE__} = sub {
return if $^S;
...;
};Re:Check caller
drhyde on 2003-11-21T09:41:36
You are a wonderful person. May I have the pleasure of buying you beer some time?