++ed by:

3 PAUSE users
2 non-PAUSE users.

Author image 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`).


This is alpha software! Read the status section in the package README or on the website.