参考手册:标准库——异常类

参考手册:标准库——异常类

Object



所有类的超类.它定义了对象的一般行为.
包含的模块:

  * Kernel

方法:

self == other

  若self 等于 other 则返回真.默认情况下,它的效果等同于equal?.

  应该根据各类的具体性质来重新定义该方法.
self =~ other

  该方法可支持将正则表达式对象置于右边的,形如 obj =~ /RE/ 的正则表达式的匹配过程.通常返回false.

  根据此定义,例如

  nil =~ /re/

  通常返回 false .
self === other

  该方法通常用在case的比较句中.默认情况下,它的运作等同于Object#==,但在子类中进行归属检测时,需要对其进行适当的再定义.
class
type ((<obsolete>))

  返回被调(receiver)的类.

  ruby 1.7 特性: 在1.7 版本中,type已被停用.
clone
dup

  生成某对象的拷贝并返回它.

  clone生成的是完整的拷贝,它包括freeze、taint和特殊方法等信息; 而dup则只拷贝对象的内容.

  请注意,clone 和 dup 生成的都是"浅层(shallow)"拷贝.它们只拷贝对象本身,而不会拷贝对象的所指(例如数组的元素等).

  另外,如果对拷贝进行如下php?name=%B2%E2%CA%D4" onclick="tagshow(event)" class="t_tag">测试的话

  obj.equal?(obj.clone)

  通常都不成立.但是

  obj == obj.clone

  通常都会成立.

  若想对true, false, nil, Symbol对象等进行拷贝时,会引发TypeError异常.

  ruby 1.7 特性: 在1.7版本中,若想对Numeric对象等immutable(内容不可改变)的对象进行拷贝时,会引发TypeError.
display(out = $stdout)

  将对象输出到 out. 其定义如下.

  class Object
  def display(out=$stdout)
   out.print to_s
   nil
  end
  end

  返回nil.
eql?(other)

  若两个对象相等则返回真.常用来判断Hash中的两个索引是否相同.

  在对该方法进行再定义的同时,也必需对Object#hash方法进行再定义.

  默认情况下,eql?的定义与equal?相同,即判断对象的同一性.
equal?(other)

  若other就是self自己时,即返回真.

  该方法不能再定义.
extend(module ... )

  将参数所指模块的实例方法追加为self的特殊方法.返回self.

  include负责向类(的实例)追加功能,而extend则只向某特定的对象追加模块的功能.

  module Foo
  def a
   'ok'
  end
  end

  obj = Object.new
  obj.extend Foo
  p obj.a   #=> "ok"

  换言之,extend的功能就是"面向特殊类的include".

  ruby 1.7 特性: 若参数中包含了多个模块时,将从最后最后的参数开始逆向进行extand.
freeze

  禁止修改对象的内容.返回self.

  若强行修改则会引发TypeError异常.
frozen?

  若某对象禁止修改其内容则返回真.
hash

  返回对象的哈希表值.用来在Hash类中保存对象.

  当A.eql?(B)成立时,则A.hash == B.hash也必须成立.若再定义eql?时,也必须对该方法进行再定义.

  默认情况下,它的返回值与Object#id的返回值相同.但是,只有Fixnum,Symbol和String使用内部哈希表函数(不可改变).

  再定义hash时,将返回任意整数.
id ((<obsolete>))
__id__
object_id ((<ruby 1.7 特性>))

  返回与各个对象对应的唯一的整数.但是,为某对象分配整数的具体情形并不固定.

  为了应对您对id方法进行再定义,Ruby提供了别名__id__,我们推荐您在库中使用后者.另外,请不要对__id__进行再定义.

  ruby 1.7 特性: 在1.7版本中,id已被停用.
inspect

  将某对象转为人工可读的字符串并返回该字符串.

  内部函数p就是使用该方法来表示某对象的.
instance_eval(expr, [fname, [lineno=1]])
instance_eval {|obj| ... }

  在对象的context中计算字符串expr并返回结果.

  若给出了fname和lineno的话,将假定字符串位于在文件fname的第lineno行,然后开始编译,并能显示文件名/行号等栈跟踪信息.

  若给出了块的话,将在对象的context中计算该块并返回结果.self将被传递给块的参数obj.

  在对象的context进行计算是指,将self设为那个对象然后开始执行.同时,若在字符串/块中定义了方法的话,则相当于定义了self的特殊方法.

  但是,局部变量将被instance_eval内部和外侧的作用域所共享.

  注: 若在方法定义中,使用instance_eval 的块来定义一个方法的话,将会导致"nested method definition"编译错误. 这主要是受到Ruby语法分析器的限制所致.

  def foo
   instance_eval {
   def bar    # <- 被看做嵌套的方法定义
    "bar"
   end
   }
  end

  # => -:4: nested method definition

  若使用字符串传递形式则可绕过该限制.

  def foo
   instance_eval %Q{
   def bar
    "bar"
   end
   }
  end

  # 执行foo时,定义bar函数(实际上是
  # foo的receiver的方法)
  foo
  p bar
  # => "bar"

  ruby 1.7 特性: 已经取消了对嵌套方法定义的限制.而且,在1.7以后的版本中,即使不使用instance_eval 也可达到同样的效果(严格说来,还是有所不同的.请参考方法定义的嵌套).

  def foo
   def bar
   "bar"
   end
  end

  foo
  p bar
  # => "bar"

  另外,请参考Module#module_eval,Module#class_eval.
instance_of?(klass)

  若self为klass类的直接的实例时,返回真.

  通常,当obj.instance_of?(c)成立时,obj.kind_of?(c)也是成立的.

  请参考kind_of?.
instance_variable_get(var)

  ruby 1.8 特性

  取得并返回对象的实例变量的值.

  可以使用字符串或者Symbol来向var指定实例变量名.

  若实例变量尚未定义,则返回nil.

  class Foo
  def initialize
   @foo = 1
  end
  end

  obj = Foo.new
  p obj.instance_variable_get("@foo")  # => 1
  p obj.instance_variable_get(foo)  # => 1
  p obj.instance_variable_get(bar)  # => nil

instance_variable_set(var, val)

  ruby 1.8 特性

  将val的值赋值给对象的实例变量并返回该值.

  可以使用字符串或Symbol来向var设定实例变量名.

  若实例变量尚未定义,则重新定义.

  obj = Object.new
  p obj.instance_variable_set("@foo", 1) # => 1
  p obj.instance_variable_set(foo, 2) # => 2
  p obj.instance_variable_get(:@foo)  # => 2

instance_variables

  以字符串数组的形式返回对象的实例变量名.

  obj = Object.new
  obj.instance_eval { @foo, @bar = nil }
  p obj.instance_variables

  # => ["@foo", "@bar"]

  另外,请参考local_variables,global_variables,Module.constants,Module#constants,Module#class_variables.
is_a?(mod)
kind_of?(mod)

  只要self是下列任何一个类的实例就返回真,这些类是:mod类和它的子类,以及包括mod模块的类和它的子类.

  module M
  end
  class C < Object
  include M
  end
  class S < C
  end

  obj = S.new
  p obj.is_a? S   # true
  p obj.is_a? M   # true
  p obj.is_a? C   # true
  p obj.is_a? Object # true
  p obj.is_a? Hash  # false

  另外,请参考instance_of?, Module#===.
method(name)

  将self的方法name对象化后得到Method对象并返回该对象.可以使用字符串或Symbol来指定name.

  另外,请参考Module#instance_method.
method_missing(name, args, ... )

  Ruby在某方法尚未定义时,就调用该方法.

  调用失败的方法名(Symbol)和当时的参数被传递给name和arg ....

  默认情况下,该方法将引发NameError异常.
methods
public_methods
private_methods
protected_methods
methods([inherited_too]) ((<ruby 1.8 特性>))
public_methods([inherited_too]) ((<ruby 1.8 特性>))
private_methods([inherited_too]) ((<ruby 1.8 特性>))
protected_methods([inherited_too]) ((<ruby 1.8 特性>))

  以字符串数组的形式返回某方法能理解的 public/private/protected 方法名列表.

  methods与instance_methods相同.ruby 1.7 特性: methods以数组形式返回public和protected方法名的列表.

  ruby 1.8 特性: 可以使用参数了.若inherited_too为真,就会搜索超类中定义的方法.默认值为真.

  methods(false)与singleton_methods(false)相同.

  例:

  class Foo
  private; def private_foo() end
  protected; def protected_foo() end
  public;  def public_foo()  end
  end

  class Bar < Foo
  end

  p Bar.new.methods    - Object.new.methods
  p Bar.new.public_methods  - Object.new.public_methods
  p Bar.new.private_methods - Object.new.private_methods
  p Bar.new.protected_methods - Object.new.protected_methods
  => ["public_foo"] # version 1.7 以后、["protected_foo", "public_foo"]
   ["public_foo"]
   ["private_foo"]
   ["protected_foo"]

  另外,请参考Module#instance_methods, Module#public_instance_methods, Module#private_instance_methods, Module#protected_instance_methods.

  请参考Object#singleton_methods.
nil?

  若receiver为nil则返回真.
respond_to?(name[, priv=false])

  若对象中包含名为name的public方法时返回真.

  name可以是Symbol或字符串.若priv为真时,则对private 方法也会返回真.
send(name[, args ... ])
send(name[, args ... ]) { .... }
__send__(name[, args ... ])
__send__(name[, args ... ]) { ... }

  调用对象的name方法,并将args传给该方法的参数,然后返回方法的结果.

  若是带块调用的话,也会把块原封不动地传给方法.方法名name可以是字符串或Symbol.

  为了应对您对send进行的再定义,Ruby提供了别名__send__,在库中应该使用后者.另外,请不要对__send__进行再定义.

  send和__send__不受调用限制的影响,可以调用任何方法.
singleton_methods
singleton_methods([inherited_too]) ((<ruby 1.7 特性>))

  以字符串数组的形式返回该对象中定义的特殊类名的列表.

  ruby 1.7 特性: 可以指定参数了.若inherited_too为伪(1.8.0之前的默认值为伪,1.8.1之后的默认值为真),则不会显示超类中定义的方法名.

  ruby 1.8 特性: 可以返回public或protected属性的特殊方法名的列表了.特别是,当singleton_methods(false)时,它等同于methods(false).

  obj = Object.new
  module Foo
  private; def private_foo() end
  protected; def protected_foo() end
  public;  def public_foo()  end
  end

  class <<obj
  include Foo
  private; def private_bar() end
  protected; def protected_bar() end
  public;  def public_bar()  end
  end
  p obj.singleton_methods
  p obj.singleton_methods(false)

  # => ["public_foo", "public_bar", "protected_foo", "protected_bar"]
   ["public_bar", "protected_bar"]

  Object#extend是面向特殊类的include,所以下例也是如此.

  obj = Object.new

  module Foo
  private; def private_foo() end
  protected; def protected_foo() end
  public;  def public_foo()  end
  end

  obj.extend(Foo)
  p obj.singleton_methods
  p obj.singleton_methods(false)

  # => ["public_foo", "protected_foo"]
   []

  对于类方法(类对象的特殊方法)来说,若参数为真时,则会显示超类中的类方法名.

  class Foo
  def Foo.foo
  end
  end

  class Bar < Foo
  def Bar.bar
  end
  end

  p Bar.singleton_methods   #=> ["bar", "foo"]
  p Bar.singleton_methods(false) #=> ["bar"]

taint

  设定对象的"污染标记".返回self.

  关于对象的污染问题,请参考安全模型.
tainted?

  若对象已经有"污染标记"则返回真.

  关于对象的污染问题,请参考安全模型.
to_a ((<obsolete>))

  将对象转换为数组之后返回该数组.

  若遇到不能转为数组的对象时,将返回只包含该对象本身且长度为1的数组.

  (ruby 1.7 特性: 以后可能会取消Object的这个方法.在1.7版本中将显示警告)。

  例

  p( {'a'=>1}.to_a ) # [["a", 1]]
  p ['array'].to_a  # ["array"]
  p 1.to_a    # [1]   (warning: default `to_a' will be obsolete)
  p 'str'.to_a   # ["str"]

  ruby 1.8 特性:在多重赋值表达式的右边出现带*的对象时,若该对象中定义了to_a方法的话,就使用它.若没有的话,就把它转换为只包含自身且长度为1的数组,然后再进行赋值.

  class Foo
  def to_a
   [1, 2, 3]
  end
  end

  a, b, c = *Foo.new
  p [a, b, c]

  # => [1, 2, 3]

to_ary

  将对象转换为数组并返回该数组.

  若需要将对象隐式地转换为数组时,会在内部自动调用.

  若某对象中定义了该方法时,就可以把它单独置入多重赋值表达式的右边进行调用.

  class Foo
  def to_ary
   [1, 2, 3]
  end
  end

  a, b, c = Foo.new
  p [a, b, c]

  => [1, 2, 3]

to_hash

  若需要将对象隐式地转换为哈希表时,会在内部自动调用.
to_int

  若需要将对象隐式地转换为整数时,会在内部自动调用.
to_s

  将对象转换为字符串并返回该字符串.

  如果把非字符串对象当做参数传给print或sprintf时,将调用该方法把非字符串对象转换为字符串.
to_str

  若需要将对象隐式地转换为字符串时,会自动调用它.
untaint

  取消对象的"污染标记".返回self.

  取消污染标记所带来的风险由程序员承担.

  若安全等级在3以上时,会引发SecurityError异常.

  关于对象的污染问题,请参考安全模型.

private方法:

initialize

  用户定义类的对象初始化方法.

  在对由Class#new新生成的对象进行初始化时要调用该方法.默认情况下,没有任何的动作.通常会在子类中根据需要对其进行再定义.传递给Class#new的参数会被原封不动地传递给initialize.

  initialize方法会被自动地设定为 private类型.
initialize_copy(obj)

  ruby 1.8 特性

  (基于扩展库)用户定义类的对象拷贝(clone,dup)的初始化方法.

  该方法以obj的内容来置换self. 但self的实例变量以及特殊方法不会发生变化.

  当receiver被freeze时,或者obj的类与receiver的类不同时,将引发TypeError异常.

  在默认情况下(Object#initialize_copy)只会进行上述的freeze检查和类型检查,然后就返回self.

  obj.dup对新生成的对象调用initialize_copy

  obj2 = obj.class.allocate
  obj2.initialize_copy(obj)

  对obj2,则拷贝obj的污染状态,实例变量,finalizer,然后生成拷贝.而clone甚至会拷贝特殊方法.

  obj = Object.new
  class <<obj
  attr_accessor :foo
  def bar
   :bar
  end
  end

  def check(obj)
  puts "instance variables: #{obj.inspect}"
  puts "tainted?: #{obj.tainted?}"
  print "singleton methods: "
  begin
   p obj.bar
  rescue NameError
   p $!
  end
  end

  obj.foo = 1
  obj.taint

  check Object.new.send(:initialize_copy, obj)
    # => instance variables: #<Object:0x4019c9d4>
    #  tainted?: false
    #  singleton methods: #<NoMethodError: ...>
  check obj.dup
    # => instance variables: #<Object:0x4019c9c0 @foo=1>
    #  tainted?: true
    #  singleton methods: #<NoMethodError: ...>
  check obj.clone
    # => instance variables: #<Object:0x4019c880 @foo=1>
    #  tainted?: true
    #  singleton methods: :bar

  initialize_copy主要用来拷贝Ruby解释器无法理解的信息.例如有时使用C语言来定义类,而有时不想让实例变量保存信息,此时,若使用initialize_copy将这些内部信息拷贝下来的话,就不必对dup或clone进行再定义了.

  initialize_copy方法会自动被设定为private类型.
remove_instance_variable(name)

  从对象中删除实例变量name,并返回该实例变量中的值.name可以是Symbol或字符串.

  若对象中不包含实例变量name的话,将引发NameError异常.

  class Foo
  def foo
   @foo = 1
   p remove_instance_variable :@foo # => 1
   p remove_instance_variable :@foo # => instance variable @foo not defined (NameError)
  end
  end
  Foo.new.foo

  请参考Module#remove_class_variable, Module#remove_const.
singleton_method_added(name)

  若追加了特殊方法时,解释器会调用此方法.name可以是被追加的方法名或Symbol.

  class Foo
  def singleton_method_added(name)
   puts "singleton method \"#{name}\" was added"
  end
  end

  obj = Foo.new
  def obj.foo
  end

  => singleton method "foo" was added

  若想对普通的方法追加过程添加钩子时,可使用Module#method_added.
singleton_method_removed(name)

  ruby 1.7 特性

  若使用Module#remove_method删除特殊方法时,解释器会调用此方法.name可以是被删除的方法名或Symbol.

  class Foo
  def singleton_method_removed(name)
   puts "singleton method \"#{name}\" was removed"
  end
  end

  obj = Foo.new
  def obj.foo
  end

  class << obj
  remove_method :foo
  end

  => singleton method "foo" was removed

  若想对普通的删除方法过程添加钩子时,请使用Module#method_removed.
singleton_method_undefined(name)

  ruby 1.7 特性

  当特殊方法因Module#undef_method或undef的关系而处于未定义状态时,解释器就会调用此方法.name可以是未定义的方法名或Symbol.

  class Foo
  def singleton_method_undefined(name)
   puts "singleton method \"#{name}\" was undefined"
  end
  end

  obj = Foo.new
  def obj.foo
  end
  def obj.bar
  end

  class << obj
  undef_method :foo
  end
  obj.instance_eval {undef bar}

  => singleton method "foo" was undefined
   singleton method "bar" was undefined

  若想对普通方法的未定义状态设定钩子时,请使用Module#method_undefined.
所有异常的原始类。
超类:

  * Object

类方法:

Exception.new([error_message])
Exception.exception([error_message])

  生成并返回异常对象。可以将错误信息字符串传给参数。该错误信息将变成message属性的值,并由默认的异常处理程序显示出来。

方法:

exception([error_message])

  若未指定参数时返回self。除此以外,将生成并返回自身的拷贝,同时将message属性设定为error_message。

  实际上,raise调用的是异常对象的exception方法。
backtrace

  返回回描(backtrace)信息。

   *

    "#{sourcefile}:#{sourceline}:in `#{method}'"

    (在方法内时)
   *

    "#{sourcefile}:#{sourceline}"

    (在顶层时)

  如上形式(默认情况下)的String数组。
message
to_s
to_str

  返回描述错误信息的字符串。
set_backtrace(errinfo)

  向回描信息中添加errinfo后返回该回描信息。errinfo必须是nil、String或String数组这三者中的一个。
若接收到未被trap到的SIGINT时, 就会被触发. 若收到的是SIGINT之外的其他信号时, 请参考SignalException.
超类:

  * Exception (version 1.6 以前)
  * SignalException (version 1.7 以后)
若想一次占有过大的内存时,就会触发它.

另外, 若内存不足时,通常会引发fatal错误. 但是,当安全级别($SAFE)大于4时, 就会引发该异常.
超类:

  * Exception
用来表示脚本错误的异常.
超类:

  * Exception
当require 或 load 失败时就会引发该异常.
超类:

  * ScriptError
若使用未定义的变量或常数时就会触发该异常.
超类:

  * ScriptError (version 1.6 以前)
  * StandardError (version 1.7 以后)

类方法:

NameError.new(error_message[, name]) ((<ruby 1.8 特性>))

  生成并返回异常对象. name是未定义的符号.

  err = NameError.new("message", "foo")
  p err
  p err.name

  # => #<NameError: message>
   "foo"

方法:

NameError#name

  返回未定义的符号.

  begin
  foobar
  rescue NameError
  p $!
  p $!.name
  end
  # => #<NameError: undefined local variable or method `foobar' for main:Object>
   :foobar
若调用尚未配备的功能时就会诱发该异常.
超类:

  * ScriptError
若出现语法错误时就会引发该异常.
超类:

  * ScriptError
若收到未被trap到的信号(请参考signal(2))时,就会引发该异常.

您可以从SignalException#message中的"SIGname"那里得到具体的信号名称.

在默认情况下, 下列信号会引发SignalException.

SIGHUP, SIGQUIT, SIGALRM, SIGUSR1, SIGUSR2

另外, SIGINT会引发Interrupt异常.
超类:

  * Exception