exit
isn't meant to be trapped, so eval
isn't the solution here. You could put the remaining code you need to run in an END
block:
some_function();
END { print "Still alive! For now...\n"; }
sub some_function {
print "Hello from some_function\n";
exit;
}
But if you absolutely, positively need to prevent exit
from killing the script, you'll have to redefine exit()
at compile time:
BEGIN { *CORE::GLOBAL::exit = sub (;$) { } } # Make exit() do nothing
some_function();
print "Still alive!\n"; # Gets printed
*CORE::GLOBAL::exit = *CORE::exit; # Restore exit()
exit;
print "I'm dead here.\n"; # Doesn't get printed
sub some_function { exit }
The Test::Trap module from the CPAN can be used to encapsulate this bit of ugliness for you, if you're interested in a more robust solution. Personally I would locally patch the exit
ing some_function()
to use croak
instead, and maybe file a bug report with the patch if it's a module.
If you're just eval
ing user input and you don't want them to be able to call exit
, verify that the string contains no calls to exit
or to a subroutine that would indirectly exit, then eval
it. Personally I'd be more afraid of unlink
and fork
than exit
if the user is inputting arbitrary code to be evaluated.