diff --git a/include/mruby/internal.h b/include/mruby/internal.h index 1bb746f93..d427c0702 100644 --- a/include/mruby/internal.h +++ b/include/mruby/internal.h @@ -61,6 +61,7 @@ void mrb_exc_mesg_set(mrb_state *mrb, struct RException *exc, mrb_value mesg); mrb_value mrb_exc_mesg_get(mrb_state *mrb, struct RException *exc); mrb_value mrb_f_raise(mrb_state*, mrb_value); mrb_value mrb_make_exception(mrb_state *mrb, mrb_value exc, mrb_value mesg); +mrb_value mrb_exc_get_output(mrb_state *mrb, struct RObject *exc); struct RBacktrace { MRB_OBJECT_HEADER; diff --git a/src/error.c b/src/error.c index b6bf32159..7aead11f2 100644 --- a/src/error.c +++ b/src/error.c @@ -140,6 +140,14 @@ mrb_exc_inspect(mrb_state *mrb, mrb_value exc) return (mrb_nil_p(mesg)||RSTRING_LEN(mesg)==0) ? cname : mrb_format(mrb, "#<%v: %v>", cname, mesg); } +mrb_value +mrb_exc_get_output(mrb_state *mrb, struct RObject *exc) +{ + mrb_value cname = mrb_mod_to_s(mrb, mrb_obj_value(mrb_class_real(exc->c))); + mrb_value mesg = mrb_exc_mesg_get(mrb, (struct RException*)exc); /* string or nil */ + return (mrb_nil_p(mesg)||RSTRING_LEN(mesg)==0) ? cname : mrb_format(mrb, "%v (%v)", mesg, cname); +} + void mrb_keep_backtrace(mrb_state *mrb, mrb_value exc); static void