class method
SystemCallError.new
(::string msg, ::Integer errno) -> ::SystemCallError
SystemCallError.new(msg, errno = nil, func = nil) → system_call_error_subclass
error.c
View on GitHub ↗
static VALUE
syserr_initialize(int argc, VALUE *argv, VALUE self)
{
const char *err;
VALUE mesg, error, func, errmsg;
VALUE klass = rb_obj_class(self);
if (klass == rb_eSystemCallError) {
st_data_t data = (st_data_t)klass;
rb_scan_args(argc, argv, "12", &mesg, &error, &func);
if (argc == 1 && FIXNUM_P(mesg)) {
error = mesg; mesg = Qnil;
}
if (!NIL_P(error) && st_lookup(syserr_tbl, NUM2LONG(error), &data)) {
klass = (VALUE)data;
/* change class */
if (!RB_TYPE_P(self, T_OBJECT)) { /* insurance to avoid type crash */
rb_raise(rb_eTypeError, "invalid instance type");
}
RBASIC_SET_CLASS(self, klass);
}
}
else {
rb_scan_args(argc, argv, "02", &mesg, &func);
error = rb_const_get(klass, id_Errno);
}
if (!NIL_P(error)) err = strerror(NUM2INT(error));
else err = "unknown error";
errmsg = rb_enc_str_new_cstr(err, rb_locale_encoding());
if (!NIL_P(mesg)) {
VALUE str = StringValue(mesg);
if (!NIL_P(func)) rb_str_catf(errmsg, " @ %"PRIsVALUE, func);
rb_str_catf(errmsg, " - %"PRIsVALUE, str);
}
mesg = errmsg;
rb_call_super(1, &mesg);
rb_ivar_set(self, id_errno, error);
return self;
}
If errno corresponds to a known system error code, constructs the appropriate Errno class for that error, otherwise constructs a generic SystemCallError object. The error number is subsequently available via the errno method.
If only numeric object is given, it is treated as an Integer errno, and msg is omitted, otherwise the first argument msg is used as the additional error message.
Example
SystemCallError.new(Errno::EPIPE::Errno) #=> #<Errno::EPIPE: Broken pipe> SystemCallError.new("foo") #=> #<SystemCallError: unknown error - foo> SystemCallError.new("foo", Errno::EPIPE::Errno) #=> #<Errno::EPIPE: Broken pipe - foo>
If func is not nil, it is appended to the message with “ @ ”.
Example
SystemCallError.new("foo", Errno::EPIPE::Errno, "here") #=> #<Errno::EPIPE: Broken pipe @ here - foo>
A subclass of SystemCallError can also be instantiated via the new method of the subclass. See Errno.