Darkwing has asked for the wisdom of the Perl Monks concerning the following question:
Hi, i had the problem that the contents of $@ produced by a failed eval{...} looked wired. It turned out that this was caused by a module that set the $SIG{__DIE__} handler. I then tried this:
use strict; use warnings; # Just to demonstrate the problem: $SIG{__DIE__} = sub {die "[Unwanted stuff] @_"}; eval { local %SIG; die("Something is wrong!\n"); }; print "Got: $@\n";
But i got: Got: [Unwanted stuff] Something is wrong!. Obviously, the handler is still active inside the eval{...}. Looking at perlmonks i found this http://www.perlmonks.org/?node_id=51097 and changed my code to:
use strict; use warnings; # Just to demonstrate the problem: $SIG{__DIE__} = sub {die "[Unwanted stuff] @_"}; eval { local $SIG{__DIE__}; # No sigdie handler die("Something is wrong!\n"); }; print "Got: $@\n";
Now the output is Got: Something is wrong!, meaning that the handler is switched off, which is the desired result.
But i still do not understand why my fist approach didn't work. Why does local %SIG; not turn off the handler? I expected this to just turn off all handlers. Why do i need to write local $SIG{__DIE__};? Can anybody explain this?
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Localizing %SIG
by shmem (Chancellor) on Feb 17, 2016 at 12:33 UTC | |
by Anonymous Monk on Feb 17, 2016 at 13:25 UTC | |
by kcott (Archbishop) on Feb 17, 2016 at 21:23 UTC | |
by Anonymous Monk on Feb 17, 2016 at 22:13 UTC | |
by shmem (Chancellor) on Feb 17, 2016 at 22:57 UTC | |
| |
by kcott (Archbishop) on Feb 17, 2016 at 23:34 UTC | |
by LanX (Saint) on Feb 17, 2016 at 22:50 UTC | |
| |
Re: Localizing %SIG
by LanX (Saint) on Feb 17, 2016 at 14:14 UTC | |
Re: Localizing %SIG
by Anonymous Monk on Feb 17, 2016 at 12:24 UTC |