首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Exception

Parent:Object

类Exception的子类用于在begin ... end块中的Kernel#raise和rescue语句之间进行通信。 异常对象包含关于异常的信息 - 它的类型(异常的类名),可选的描述性字符串和可选的回溯信息。 异常子类可能会添加其他信息,如NameError#名称。

程序可以创建Exception的子类,通常是StandardError或RuntimeError,以提供自定义类并添加其他信息。有关raise和的默认值,请参阅下面的子类列表rescue

当发生异常但尚未处理(在rescue,ensure,at_exit和END块中)时,全局变量$! 将包含当前异常,$ @将包含当前异常的回溯。

建议库应该有一个StandardError或RuntimeError的子类,并且有特定的异常类型从中继承。这允许用户抢救一般的异常类型,以捕获库的所有异常,即使未来版本的库添加新的异常子类时也是如此。

例如:

代码语言:javascript
复制
class MyLibrary
  class Error < RuntimeError
  end

  class WidgetError < Error
  end

  class FrobError < Error
  end

end

为了处理WidgetError和FrobError,库用户可以拯救MyLibrary :: Error。

Exception的内置子类是:

  • NoMemoryError
  • ScriptError
代码语言:txt
复制
-  [LoadError](loaderror)
代码语言:txt
复制
-  [NotImplementedError](notimplementederror)
代码语言:txt
复制
-  [SyntaxError](syntaxerror)
  • SecurityError
  • SignalException
代码语言:txt
复制
-  [Interrupt](interrupt)
  • StandardError – default for rescue
代码语言:txt
复制
-  [ArgumentError](argumenterror)
代码语言:txt
复制
    -  [UncaughtThrowError](uncaughtthrowerror)
代码语言:txt
复制
-  [EncodingError](encodingerror)
代码语言:txt
复制
-  [FiberError](fibererror)
代码语言:txt
复制
-  [IOError](ioerror)
代码语言:txt
复制
    -  [EOFError](eoferror)
代码语言:txt
复制
-  [IndexError](indexerror)
代码语言:txt
复制
    -  [KeyError](keyerror)
代码语言:txt
复制
    -  [StopIteration](stopiteration)
代码语言:txt
复制
-  [LocalJumpError](localjumperror)
代码语言:txt
复制
-  [NameError](nameerror)
代码语言:txt
复制
    -  [NoMethodError](nomethoderror)
代码语言:txt
复制
-  [RangeError](rangeerror)
代码语言:txt
复制
    -  [FloatDomainError](floatdomainerror)
代码语言:txt
复制
-  [RegexpError](regexperror)
代码语言:txt
复制
-  [RuntimeError](runtimeerror) – default for `raise`
代码语言:txt
复制
-  [SystemCallError](systemcallerror)
代码语言:txt
复制
    -  Errno::\*
代码语言:txt
复制
-  [ThreadError](threaderror)
代码语言:txt
复制
-  [TypeError](typeerror)
代码语言:txt
复制
-  [ZeroDivisionError](zerodivisionerror)
  • SystemExit
  • SystemStackError
  • fatal – impossible to rescue

公共类方法

exception(string) → an_exception or exc

如果没有参数,或者参数与接收器相同,则返回接收器。否则,创建一个与接收者类相同的新异常对象,但消息等于string.to_str

json_create(object) Show source

通过构造具有消息m的新的Exception对象和使用to_json序列化的backtrace b来反序列化JSON字符串

代码语言:javascript
复制
# File ext/json/lib/json/add/exception.rb, line 10
def self.json_create(object)
  result = new(object['m'])
  result.set_backtrace object['b']
  result
end

new(msg = nil) → exception Show source

构造一个新的Exception对象,可选地传入消息。

代码语言:javascript
复制
static VALUE
exc_initialize(int argc, VALUE *argv, VALUE exc)
{
    VALUE arg;

    rb_scan_args(argc, argv, "01", &arg);
    rb_ivar_set(exc, id_mesg, arg);
    rb_ivar_set(exc, id_bt, Qnil);

    return exc;
}

公共实例方法

exc == obj → true or false Show source

平等 - 如果obj不是Exception,则返回false。 否则,如果exc和obj共享相同的类、消息和回溯,则返回true。

代码语言:javascript
复制
static VALUE
exc_equal(VALUE exc, VALUE obj)
{
    VALUE mesg, backtrace;

    if (exc == obj) return Qtrue;

    if (rb_obj_class(exc) != rb_obj_class(obj)) {
        int status = 0;

        obj = rb_protect(try_convert_to_exception, obj, &status);
        if (status || obj == Qundef) {
            rb_set_errinfo(Qnil);
            return Qfalse;
        }
        if (rb_obj_class(exc) != rb_obj_class(obj)) return Qfalse;
        mesg = rb_check_funcall(obj, id_message, 0, 0);
        if (mesg == Qundef) return Qfalse;
        backtrace = rb_check_funcall(obj, id_backtrace, 0, 0);
        if (backtrace == Qundef) return Qfalse;
    }
    else {
        mesg = rb_attr_get(obj, id_mesg);
        backtrace = exc_backtrace(obj);
    }

    if (!rb_equal(rb_attr_get(exc, id_mesg), mesg))
        return Qfalse;
    if (!rb_equal(exc_backtrace(exc), backtrace))
        return Qfalse;
    return Qtrue;
}

as_json(*) Show source

返回一个散列,它将变成一个JSON对象并表示这个对象。

代码语言:javascript
复制
# File ext/json/lib/json/add/exception.rb, line 18
def as_json(*)
  {
    JSON.create_id => self.class.name,
    'm'            => message,
    'b'            => backtrace,
  }
end

backtrace → array Show source

返回与异常相关的任何回溯。回溯是一个字符串数组,每个字符串都包含“filename:lineNo:in'method'''或'filename:lineNo。''

代码语言:javascript
复制
def a
  raise "boom"
end

def b
  a()
end

begin
  b()
rescue => detail
  print detail.backtrace.join("\n")
end

产生结果:

代码语言:javascript
复制
prog.rb:2:in `a'
prog.rb:6:in `b'
prog.rb:10
代码语言:javascript
复制
static VALUE
exc_backtrace(VALUE exc)
{
    VALUE obj;

    obj = rb_attr_get(exc, id_bt);

    if (rb_backtrace_p(obj)) {
        obj = rb_backtrace_to_str_ary(obj);
        /* rb_ivar_set(exc, id_bt, obj); */
    }

    return obj;
}

backtrace_locations → array Show source

返回与异常相关的任何回溯。此方法与#backtrace类似,但回溯是Thread :: Backtrace :: Location的数组。

现在,这个方法不受#set_backtrace的影响。

代码语言:javascript
复制
static VALUE
exc_backtrace_locations(VALUE exc)
{
    VALUE obj;

    obj = rb_attr_get(exc, id_bt_locations);
    if (!NIL_P(obj)) {
        obj = rb_backtrace_to_location_ary(obj);
    }
    return obj;
}

cause → an_exception or nil Show source

返回此异常发生时的前一个异常($!)。这对包装异常并保留原始异常信息很有用。

代码语言:javascript
复制
static VALUE
exc_cause(VALUE exc)
{
    return rb_attr_get(exc, id_cause);
}

exception(string) → an_exception or exc Show source

如果没有参数,或者参数与接收器相同,则返回接收器。否则,创建一个与接收者类相同的新异常对象,但消息等于string.to_str

代码语言:javascript
复制
static VALUE
exc_exception(int argc, VALUE *argv, VALUE self)
{
    VALUE exc;

    if (argc == 0) return self;
    if (argc == 1 && self == argv[0]) return self;
    exc = rb_obj_clone(self);
    exc_initialize(argc, argv, exc);

    return exc;
}

inspect → string Show source

返回这个异常的类名和消息

代码语言:javascript
复制
static VALUE
exc_inspect(VALUE exc)
{
    VALUE str, klass;

    klass = CLASS_OF(exc);
    exc = rb_obj_as_string(exc);
    if (RSTRING_LEN(exc) == 0) {
        return rb_str_dup(rb_class_name(klass));
    }

    str = rb_str_buf_new2("#<");
    klass = rb_class_name(klass);
    rb_str_buf_append(str, klass);
    rb_str_buf_cat(str, ": ", 2);
    rb_str_buf_append(str, exc);
    rb_str_buf_cat(str, ">", 1);

    return str;
}

message → string Show source

返回调用的结果exception.to_s。通常这会返回异常的消息或名称。

代码语言:javascript
复制
static VALUE
exc_message(VALUE exc)
{
    return rb_funcallv(exc, idTo_s, 0, 0);
}

set_backtrace(backtrace) → array Show source

设置与exc相关的回溯信息。 回溯必须是#backtrace中描述的格式的String对象或单个字符串的数组。

代码语言:javascript
复制
static VALUE
exc_set_backtrace(VALUE exc, VALUE bt)
{
    return rb_ivar_set(exc, id_bt, rb_check_backtrace(bt));
}

to_json(*args) Show source

将消息m和回溯数组存储b存为JSON字符串的类名(Exception)

代码语言:javascript
复制
# File ext/json/lib/json/add/exception.rb, line 28
def to_json(*args)
  as_json.to_json(*args)
end

to_s → string Show source

返回异常的消息(如果没有消息设置,则返回异常的名称)。

代码语言:javascript
复制
static VALUE
exc_to_s(VALUE exc)
{
    VALUE mesg = rb_attr_get(exc, idMesg);

    if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
    return rb_String(mesg);
}

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com