Class: SystemCallError (Ruby 2.3.4)

    In Files

    • error.c

    Parent

    Methods

    Class/Module Index [+]

    Quicksearch

    SystemCallError

    SystemCallError is the base class for all low-level platform-dependent errors.

    The errors available on the current platform are subclasses of SystemCallError and are defined in the Errno module.

    File.open("does/not/exist")
    

    raises the exception:

    Errno::ENOENT: No such file or directory - does/not/exist

    Public Class Methods

    system_call_error === other → true or false click to toggle source

    Return true if the receiver is a generic SystemCallError, or if the error numbers self and other are the same.

     
                   static VALUE
    syserr_eqq(VALUE self, VALUE exc)
    {
        VALUE num, e;
    
        if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) {
            if (!rb_respond_to(exc, id_errno)) return Qfalse;
        }
        else if (self == rb_eSystemCallError) return Qtrue;
    
        num = rb_attr_get(exc, id_errno);
        if (NIL_P(num)) {
            num = rb_funcallv(exc, id_errno, 0, 0);
        }
        e = rb_const_get(self, id_Errno);
        if (FIXNUM_P(num) ? num == e : rb_equal(num, e))
            return Qtrue;
        return Qfalse;
    }
                
    new(msg, errno) → system_call_error_subclass click to toggle source

    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.

     
                   static VALUE
    syserr_initialize(int argc, VALUE *argv, VALUE self)
    {
    #if !defined(_WIN32)
        char *strerror();
    #endif
        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);
            OBJ_INFECT(errmsg, mesg);
        }
        mesg = errmsg;
    
        rb_call_super(1, &mesg);
        rb_ivar_set(self, id_errno, error);
        return self;
    }
                

    Public Instance Methods

    errno → fixnum click to toggle source

    Return this SystemCallError’s error number.

     
                   static VALUE
    syserr_errno(VALUE self)
    {
        return rb_attr_get(self, id_errno);
    }