++ed by:

2 PAUSE users
1 non-PAUSE user.

Christian Jaeger
and 1 contributors




 use FP::Repl::WithRepl;
 withrepl { die "foo"; };  # shows the exception, then runs a repl
                           # within the exception context

 push_withrepl (0); # turn on using a repl globally, but storing the
                    # previous handler on a stack; the argument says
                    # how many levels from the current one to go back
                    # for the search of 'eval' (the WORKAROUND, see
                    # below)

 WithRepl_eval ...; # like `eval` but transparent for WithRepl
                    # handlers (takes an optional package argument, by
                    # default the caller's package is used)

 my ($v,$e,$is_error)= WithRepl_eval_e("code",$maybe_package);
                    # unlike WithRepl_eval and eval, this safely
                    # returns the result of the given code, or $e==$@
                    # and $is_error==1 in case of an exception/error.

 pop_withrepl; # restore the handler that was pushed last.


Sets `$SIG{__DIE__}` to a wrapper that shows the exception then calls a repl from FP::Repl. This means, when getting an exception, instead of terminating the program (with a message), you get a chance to inspect the program state interactively.

Note that it currently employs a WORKAROUND to check from within the sig handler whether there's a new `(eval)` frame on the stack between the point of the handler call and the point of the handler installation (or n frames back from there, as per the argument to `push_withrepl`).