当程序执行出错时通常的做法是抛出一个异常,这个异常既可以是内建的异常类型也可以是自定义的异常类型。
内建的异常类型如下:
通常自定义异常类型是 rb_eException
或者 rb_eStandardError
的子类。先使用 rb_define_class
定义一个异常类型,然后再抛出一个异常。
抛出异常的方法:
其中 rb_raise(error_class, error_string, ...)
的作用与 ruby 中的 raise Error, string
相同。
在 Ruby 中可以使用 rescue
捕获一个异常,在C代码中与之对应的函数为:
rb_rescue
方法对应 ruby 的 rescue
,它的四个参数依次是, cb
: 要执行的操作,格式声明为 VALUE cb(VALUE args)
; cb_args
: 传递给 cb
函数的参数; rescue_cb
: 出现异常时处理异常的回调函数,格式声明为 VALUE rescue_cb(VALUE args, VALUE err)
; rescue_args
: 传递给 rescue_cb
函数的参数。
转化为 ruby 的语法如下:
begin
cb(cb_args)
rescue
rescue_cb(rescue_args)
end
rb_ensure
方法对应 ruby 的 ensure
,与 rb_rescue
类似。 ensure_cb
格式声明为 VALUE ensure_cb(VALUE args)
转化为 ruby 的语法如下:
begin
cb(cb_args)
ensure
ensure_cb(ensure_args)
end
rb_catch
方法的三个参数分别为: 要catch的代码块名称; catch 的回调函数; 回调参数。
rb_throw
方法的两个参数分别为: 返回的catch代码块名称; 返回值。
关于异常的用法可以参考本章的示例。