Exception
class Exception
Parent:Object
类Exception的子类用于在begin ... end块中的Kernel#raise和rescue语句之间进行通信。 异常对象包含关于异常的信息 - 它的类型(异常的类名),可选的描述性字符串和可选的回溯信息。 异常子类可能会添加其他信息,如NameError#名称。
程序可以创建Exception的子类,通常是StandardError或RuntimeError,以提供自定义类并添加其他信息。有关raise
和的默认值,请参阅下面的子类列表rescue
。
当发生异常但尚未处理(在rescue,ensure,at_exit和END块中)时,全局变量$! 将包含当前异常,$ @将包含当前异常的回溯。
建议库应该有一个StandardError或RuntimeError的子类,并且有特定的异常类型从中继承。这允许用户抢救一般的异常类型,以捕获库的所有异常,即使未来版本的库添加新的异常子类时也是如此。
例如:
class MyLibrary
class Error < RuntimeError
end
class WidgetError < Error
end
class FrobError < Error
end
end
为了处理WidgetError和FrobError,库用户可以拯救MyLibrary :: Error。
Exception的内置子类是:
- NoMemoryError
- [LoadError](loaderror)
- [NotImplementedError](notimplementederror)
- [SyntaxError](syntaxerror)
- SecurityError
- [Interrupt](interrupt)
- StandardError – default for
rescue
- [ArgumentError](argumenterror)
- [UncaughtThrowError](uncaughtthrowerror)
- [EncodingError](encodingerror)
- [FiberError](fibererror)
- [IOError](ioerror)
- [EOFError](eoferror)
- [IndexError](indexerror)
- [KeyError](keyerror)
- [StopIteration](stopiteration)
- [LocalJumpError](localjumperror)
- [NameError](nameerror)
- [NoMethodError](nomethoderror)
- [RangeError](rangeerror)
- [FloatDomainError](floatdomainerror)
- [RegexpError](regexperror)
- [RuntimeError](runtimeerror) – default for `raise`
- [SystemCallError](systemcallerror)
- Errno::\*
- [ThreadError](threaderror)
- [TypeError](typeerror)
- [ZeroDivisionError](zerodivisionerror)
- SystemExit
公共类方法
exception(string) → an_exception or exc
如果没有参数,或者参数与接收器相同,则返回接收器。否则,创建一个与接收者类相同的新异常对象,但消息等于string.to_str
。
json_create(object) Show source
通过构造具有消息m的新的Exception对象和使用to_json序列化的backtrace b来反序列化JSON字符串
# 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对象,可选地传入消息。
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。
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对象并表示这个对象。
# 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。''
def a
raise "boom"
end
def b
a()
end
begin
b()
rescue => detail
print detail.backtrace.join("\n")
end
产生结果:
prog.rb:2:in `a'
prog.rb:6:in `b'
prog.rb:10
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的影响。
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
返回此异常发生时的前一个异常($!)。这对包装异常并保留原始异常信息很有用。
static VALUE
exc_cause(VALUE exc)
{
return rb_attr_get(exc, id_cause
}
exception(string) → an_exception or exc Show source
如果没有参数,或者参数与接收器相同,则返回接收器。否则,创建一个与接收者类相同的新异常对象,但消息等于string.to_str
。
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
返回这个异常的类名和消息
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
。通常这会返回异常的消息或名称。
static VALUE
exc_message(VALUE exc)
{
return rb_funcallv(exc, idTo_s, 0, 0
}
set_backtrace(backtrace) → array Show source
设置与exc相关的回溯信息。 回溯必须是#backtrace中描述的格式的String对象或单个字符串的数组。
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)
# 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
返回异常的消息(如果没有消息设置,则返回异常的名称)。
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
}