ruby的rb_raise如何停止执行调用它的c函数?

Adr*_*ian 6 c ruby raise

如果你在一个使用C的函数中编写一个ruby方法,rb_raise那么调用之后函数的一部分将不会被激活,程序将停止,你会认为rb_raise使用了exit().但是如果你在ruby中拯救异常,比如:

begin
  method_that_raises_an_exception
rescue
end
puts 'You wil still get here.'
Run Code Online (Sandbox Code Playgroud)

ruby代码将继续,但您的函数将停止执行.怎么rb_raise做到这一点?

caf*_*caf 6

据推测它使用setjmp(在调用方法之前)和longjmp(in rb_raise).