Exception: SystemCallError

Inherits:
StandardError show all
Defined in:
error.c,
error.c

Overview

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

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Exception

#==, #backtrace, #backtrace_locations, #cause, #detailed_message, #exception, exception, #full_message, #inspect, #message, #set_backtrace, #to_s, to_tty?

Constructor Details

#new(msg, errno) ⇒ Object

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.



2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
# File 'error.c', line 2763

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;
}

Class Method Details

.===(other) ⇒ Boolean

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

Returns:

  • (Boolean)


2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
# File 'error.c', line 2827

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);
    return RBOOL(FIXNUM_P(num) ? num == e : rb_equal(num, e));
}

Instance Method Details

#errnoInteger

Return this SystemCallError’s error number.

Returns:



2813
2814
2815
2816
2817
# File 'error.c', line 2813

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