mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
error.c: Exception#cause
* error.c (exc_cause): captured previous exception. * eval.c (make_exception): capture previous exception automagically. [Feature #8257] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43636 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2fff948394
commit
b050cc5ab9
4 changed files with 35 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
Sun Nov 10 22:16:19 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* error.c (exc_cause): captured previous exception.
|
||||||
|
|
||||||
|
* eval.c (make_exception): capture previous exception automagically.
|
||||||
|
[Feature #8257]
|
||||||
|
|
||||||
Sun Nov 10 08:37:20 2013 Zachary Scott <e@zzak.io>
|
Sun Nov 10 08:37:20 2013 Zachary Scott <e@zzak.io>
|
||||||
|
|
||||||
* thread.c: [DOC] Remove duplicate reference
|
* thread.c: [DOC] Remove duplicate reference
|
||||||
|
|
9
error.c
9
error.c
|
@ -780,6 +780,14 @@ rb_exc_set_backtrace(VALUE exc, VALUE bt)
|
||||||
return exc_set_backtrace(exc, bt);
|
return exc_set_backtrace(exc, bt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VALUE
|
||||||
|
exc_cause(VALUE exc)
|
||||||
|
{
|
||||||
|
ID id_cause;
|
||||||
|
CONST_ID(id_cause, "cause");
|
||||||
|
return rb_attr_get(exc, id_cause);
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
try_convert_to_exception(VALUE obj)
|
try_convert_to_exception(VALUE obj)
|
||||||
{
|
{
|
||||||
|
@ -1742,6 +1750,7 @@ Init_Exception(void)
|
||||||
rb_define_method(rb_eException, "inspect", exc_inspect, 0);
|
rb_define_method(rb_eException, "inspect", exc_inspect, 0);
|
||||||
rb_define_method(rb_eException, "backtrace", exc_backtrace, 0);
|
rb_define_method(rb_eException, "backtrace", exc_backtrace, 0);
|
||||||
rb_define_method(rb_eException, "set_backtrace", exc_set_backtrace, 1);
|
rb_define_method(rb_eException, "set_backtrace", exc_set_backtrace, 1);
|
||||||
|
rb_define_method(rb_eException, "cause", exc_cause, 0);
|
||||||
|
|
||||||
rb_eSystemExit = rb_define_class("SystemExit", rb_eException);
|
rb_eSystemExit = rb_define_class("SystemExit", rb_eException);
|
||||||
rb_define_method(rb_eSystemExit, "initialize", exit_initialize, -1);
|
rb_define_method(rb_eSystemExit, "initialize", exit_initialize, -1);
|
||||||
|
|
4
eval.c
4
eval.c
|
@ -641,6 +641,10 @@ make_exception(int argc, VALUE *argv, int isstr)
|
||||||
if (argc > 2)
|
if (argc > 2)
|
||||||
set_backtrace(mesg, argv[2]);
|
set_backtrace(mesg, argv[2]);
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
VALUE cause = get_errinfo();
|
||||||
|
if (!NIL_P(cause)) rb_iv_set(mesg, "cause", cause);
|
||||||
|
}
|
||||||
|
|
||||||
return mesg;
|
return mesg;
|
||||||
}
|
}
|
||||||
|
|
|
@ -476,4 +476,19 @@ end.join
|
||||||
def test_stackoverflow
|
def test_stackoverflow
|
||||||
assert_raise(SystemStackError){m}
|
assert_raise(SystemStackError){m}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_cause
|
||||||
|
msg = "[Feature #8257]"
|
||||||
|
e = assert_raise(StandardError) {
|
||||||
|
begin
|
||||||
|
raise msg
|
||||||
|
rescue => e
|
||||||
|
assert_nil(e.cause, msg)
|
||||||
|
raise StandardError
|
||||||
|
end
|
||||||
|
}
|
||||||
|
cause = e.cause
|
||||||
|
assert_instance_of(RuntimeError, cause, msg)
|
||||||
|
assert_equal(msg, cause.message, msg)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue