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

在rescue部分中, 即使没有给出具体的错误类, 也可以利用该异常类及其子类来捕捉异常.
超类:

  * Exception
若参数个数不对或者参数值错误时,就会引发该异常.

Time.at   # => wrong number of arguments (0 for 1) (ArgumentError)
Array.new(-1) # => negative array size (ArgumentError)

等等
超类:

  * StandardError
若索引超出范围就会引发该异常.
超类:

  * StandardError
若I/O发生错误时就会引发该异常.
超类:

  * StandardError
若到达EOF(End Of File)时就会引发该异常.
超类:

  * IOError
若在超出作用域的Proc中使用return,break,retry时,就会引发该异常.

请参考Proc的例子.
超类:

  * StandardError

方法

exit_value ((<ruby 1.8 特性>))

  返回引发LocalJumpError异常的break或return的指定返回值.

  def foo
  proc { return 10 }
  end

  begin
  foo.call
  rescue LocalJumpError
  p $!
  p $!.reason
  p $!.exit_value
  end

  => ruby 1.8.0 (2003-06-09) [i586-linux]
   #<LocalJumpError: return from block-closure>
   :return
   10

  begin
  Block.new { break 5 }.call
  rescue LocalJumpError
  p $!
  p $!.reason
  p $!.exit_value
  end

  => ruby 1.8.0 (2003-06-09) [i586-linux]
   #<LocalJumpError: break from block-closure>
   :break
   5

reason ((<ruby 1.8 特性>))

  以符号的形式返回引发异常的原因. 返回值是下列之一:

   * :break
   * :redo
   * :retry
   * :next
   * :return

  请参考exit_value的例子.
ruby 1.7 特性: 若调用了未定义的方法时,就会引发该异常.

self.bar
=> -:1: undefined method `bar' for #<Object:0x401a6c40> (NoMethodError)

若不是以方法调用的形式出现的话, 就会引发NameError异常.

bar
=> -:1: undefined local variable or method `bar' for #<Object:0x401a6c40> (NameError)

超类:

  * NameError

类方法:

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

  生成并返回异常对象. args是调用方法的过程中使用的参数.

  nom = NoMethodError.new("message", "foo", [1,2,3])
  p nom.name
  p nom.args

  # => "foo"
   [1, 2, 3]

方法:

args ((<ruby 1.8 特性>))

  以数组的形式返回方法调用过程中使用的参数.

  begin
  foobar(1,2,3)
  rescue NoMethodError
  p $!
  p $!.name
  p $!.args
  end

  # => #<NoMethodError: undefined method `foobar' for main:Object>
   :foobar
   [1, 2, 3]
与范围有关的异常。在进行超出范围的数值变换(从Bignum变为Fixnum)等操作时就会引发该异常。
超类:

  * StandardError
若想将正负无穷或NaN(Not a Number)变为Bignum,或与NaN进行比较时就会引发该异常。
超类:

  * RangeError