6

在红宝石中,

begin
  # ...
rescue
  # ...
end

不会捕获不是StandardError. 在 C 中,

rb_rescue(x, Qnil, y, Qnil);

VALUE x(void) { /* ... */ return Qnil; }
VALUE y(void) { /* ... */ return Qnil; }

会做同样的事情。我怎样才能rescue Exception => e从 ruby​​ C 扩展(而不仅仅是rescue => e)?

4

1 回答 1

5

Ruby 需要更多文档。我不得不进入 ruby​​ 源代码,这就是我发现的:

VALUE
rb_rescue(VALUE (* b_proc)(ANYARGS), VALUE data1,
      VALUE (* r_proc)(ANYARGS), VALUE data2)
{
    return rb_rescue2(b_proc, data1, r_proc, data2, rb_eStandardError,
              (VALUE)0);
}

所以,我的问题(我猜)的答案是:

rb_rescue2(x, Qnil, y, Qnil, rb_eException, (VALUE)0);

VALUE x(void) { /* ... */ return Qnil; }
VALUE y(void) { /* ... */ return Qnil; }
于 2010-07-09T22:23:17.430 回答