2010-07-09 13 views
6

Trong ruby,Tiện ích mở rộng Ruby c: Làm thế nào tôi có thể nắm bắt tất cả ngoại lệ, bao gồm cả những thứ không phải là StandardErrors?

begin 
    # ... 
rescue 
    # ... 
end 

sẽ không bắt ngoại lệ mà không phải là lớp con của StandardError. Trong C,

rb_rescue(x, Qnil, y, Qnil); 

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

cũng sẽ làm tương tự. Làm thế nào tôi có thể rescue Exception => e từ tiện ích mở rộng Ruby (thay vì chỉ rescue => e)?

Trả lời

5

Ruby cần thêm tài liệu. Tôi đã phải đi vào trong mã nguồn ruby, và đây là những gì tôi tìm thấy:

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); 
} 

Vì vậy, câu trả lời cho câu hỏi của tôi (tôi đoán) sẽ là:

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

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

+1 Chỉ cần nhấn cùng vấn đề và khám phá này đã giải quyết được vấn đề của tôi. –

+0

Tôi sẽ bỏ phiếu này, nhưng không rõ ràng về những gì gọi lại làm những gì. Những gì được gọi trong trường hợp cứu hộ? Những gì đang được giải cứu? –

+0

Tôi giả sử 'b_proc' là mã sau câu lệnh' begin' và 'r_proc' là mã cứu hộ. – Vortico