Ruby c расширения: Как я могу поймать все исключения, включая вещи, которые не являются StandardErrors?

В рубине,

begin
  # ...
rescue
  # ...
end

не поймает исключения, которые не являются подклассами StandardError. В C,

rb_rescue(x, Qnil, y, Qnil);

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

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

6
задан Matheus Moreira 24 February 2012 в 16:42
поделиться

1 ответ

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; }
5
ответ дан 17 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: