Расширения Ruby c: Как я могу перехватить все исключения, включая вещи, которые не являются стандартными ошибками? - PullRequest
6 голосов
/ 10 июля 2010

в рубине

begin
  # ...
rescue
  # ...
end

не будет ловить исключения, которые не являются подклассами StandardError. В С

rb_rescue(x, Qnil, y, Qnil);

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

сделает то же самое. Как я могу rescue Exception => e из расширения ruby ​​C (вместо просто rescue => e)?

1 Ответ

5 голосов
/ 10 июля 2010

Руби нужно больше документации.Я должен был войти в исходный код 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; }
...