В рубине,
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
)?
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; }