Sam Roberts wrote: > I'm wrapping a library, it returns its errors as numbers (many of them, > too many to wrap even automatically), and I don't know how to raise > exceptions. > > I've looked at how ruby deals with unix error numbers. I guess I > could cut-n-paste all the code to that my extension does the same... but > that seems wrong, somehow. > > What I'd really like to do is have only one error class, but raise > objects as exceptions, with the objects @errno set to the value, > I'd do this in ruby like this: > > class MyErr < StandardError > attr_reader :eno > def initialize(eno); @eno = eno; end > end > > > ... > raise MyError.new(35) > > Looking at the exception raising APIs in README.EXT, I can't quite see > how to do this. > In short: rb_exc_raise(my_err_new(eno)); You probably want to have the ability to add a message to your error objects so you may want to do: rb_exc_raise(my_err_new("msg", eno)); or define a function like static void raise_my_err(int eno, const char *fmt, ...) { va_list args; char buf[BUFSIZ]; va_init_list(args, fmt); vsnprintf(buf, BUFSIZ, fmt, args); va_end(args); rb_exc_raise(my_err_new(buf, eno)); } most of the above is a copy and paste from code in error.c. I think your new function would look something like this: static VALUE my_err_new(const char *buf, int eno) { VALUE self = rb_exc_new2(cMyErr, buf); rb_iv_set(self, "@eno", INT2FIX(eno)); return self; } -Charlie