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

若未能成功编译正则表达式,则引发该异常。

Regexp.new("*")
=> in `initialize': invalid regular expression; there's no previous \
 pattern, to which '*' would define cardinality at 1: /*/ (RegexpError)

超类:

  * StandardError
运行时异常。当调用了raise却未指定异常时,就会引发该异常。
超类:

  * StandardError
若发生安全问题时,就会引发该异常。请参考安全模型。
超类:

  * StandardError
若系统调用失败的话,就会引发该异常. 实际上,它并非是SystemCallError本身,而是其子类Errno模块的内部类(与各errno同名).
超类:

  * StandardError

类方法:

SystemCallError.new(error_message)
SystemCallError.new(error_message, errno) ((<ruby 1.8 特性>))
SystemCallError.new(errno) ((<ruby 1.8 特性>))

  在不指定errno的第一种形式中, 生成并返回SystemCallError对象. 在后面的两种形式中, 生成并返回与整数errno相对应的Errno::EXXX对象.

  p SystemCallError.new("message")
  p SystemCallError.new("message", 2)
  p SystemCallError.new(2)
  p SystemCallError.new(256)

  # => #<SystemCallError: unknown error - message>
   #<Errno::ENOENT: No such file or directory - message>
   #<Errno::ENOENT: No such file or directory>
   #<SystemCallError: Unknown error 256>

SystemCallError === other ((<ruby 1.7 特性>))

  当other是SystemCallError的子类时为真. (与Module#===相同).

  另外, 当左边是SystemCallError的子类时, 若other.errno的值(若为nil则取该类的常数Errno的值)与self::Errno相等的话就返回真.

  使用该方法, 您就可以像下面这样来捕捉那些errno值相同的异常.

  p Errno::EAGAIN::Errno
  p Errno::EWOULDBLOCK::Errno
  begin
  raise Errno::EAGAIN, "pseudo error"
  rescue Errno::EWOULDBLOCK
  p $!
  end

  # => 11
   11
   #<Errno::EAGAIN: pseudo error>

  目前,SystemCallError#=== 的这个特性还没什么用处. (因为它们变成了同一个对象,如下)

  p Errno::EAGAIN
  p Errno::EWOULDBLOCK
  p Errno::EWOULDBLOCK.id
  p SystemCallError.new(11).class.id

  => Errno::EAGAIN
   Errno::EAGAIN
   537747360
   537747360

方法:

errno

  返回系统所返回的 errno 的值. 若实际上并未发生系统调用错误时,就返回nil.

  例:

  若像第二个例子那样故意使用raise来引发
  一个虚拟异常时,就需要注意了.

  begin
   open("nonexistent file")
  rescue Errno::ENOENT
   p Errno::ENOENT::Errno  # => 2
   p $!.errno      # => 2
  end

  begin
   raise Errno::ENOENT
  rescue Errno::ENOENT
   p Errno::ENOENT::Errno  # => 2
   p $!.errno      # => nil
  end

  ((<ruby 1.8 特性>)): 在初始化errno值时
  才会设定Errno::EXXX异常对象.

  begin
   raise Errno::ENOENT
  rescue Errno::ENOENT
   p Errno::ENOENT::Errno  # => 2
   p $!.errno      # => 2
  end

  若想取得尚未发生的异常所对应的errno值时, 请使用常数Errno::EXXX::Errno.
与各errno相对应的异常类. 若想了解实际的类名的话, 请参考模块Errno和系统手册errno(3).
超类:

  * SystemCallError

常数:

Errno

  与各个类相对应的errno的值.

  通常情况下, Errno::EXXX::Errno常数中都会包含对应的值, 但如果并未发生实际意义上的异常时, SystemCallError#errno方法会返回nil.

  ruby 1.8 特性: 在Errno::EXXX中, 生成对象时才会设定对应的errno值. 请参考下例.

  例:

   在有些系统中,Errno::EAGAIN和Errno::EWOULDBLOCK异常类具有相同的errno值. 下例中使用Errno常数来探讨这个问题.

   p Errno::EAGAIN::Errno    # => 11
   p Errno::EWOULDBLOCK::Errno   # => 11

   p Errno::EAGAIN.new.errno   # => nil
   p Errno::EWOULDBLOCK.new.errno  # => nil

   ruby 1.8 特性

   p Errno::EAGAIN.new.errno   # => 11
   p Errno::EWOULDBLOCK.new.errno  # => 11
若栈深度过深的话就会引发该异常.

大多数情况下, 在发生溢出之前都会先进行检查然后再引发SystemStackError异常, 但有时也会跳过检查进而造成溢出. 此时OS不能调用信号处理程序, 也不会给出[BUG]错误信息, 而是直接就强行关闭了. 我们正在商讨解决这个问题的对策.
超类:

  * StandardError
若发生与Thread有关的错误时, 就会引发该异常.

  * 对当前线程进行join操作时
  * 在join中即将发生死锁时
  * 对已终止的线程进行wakeup操作时
  * 对唯一的线程进行Thread.stop操作时
  * 未给出迭代器却又想要生成线程时
  * 在线程内部未能catch到throw时
  * 在线程中进行return操作时

超类:

  * StandardError
若使用了错误的类型时, 就会引发该异常.
超类:

  * StandardError
若将某值除以0时, 就会引发该异常.
超类:

  * StandardError
结束ruby的运行.
超类:

  * Exception

类方法:

SystemExit.new([status], [error_message])

  ruby 1.7 特性

  生成并返回SystemExit异常.

  若第一参数为整数, 则认为已经指派了status参数. 除此之外的参数的处理方式与Exception.new相同.

  若指定了status参数的话, 其值将会被当做结束状态值传给新生成对象的status属性(省略时的缺省值为0).

  e = SystemExit.new(1)
  p e.status

  => 1

方法:

status ((<ruby 1.7 特性>))

  返回结束状态值. 可以使用exit或SystemExit.new等方式来设定结束状态值.

  begin
  exit(1)
  rescue SystemExit
  p $!
  p $!.status
  end

  => #<SystemExit: exit>
   1

  begin
  raise SystemExit.new(1, "bogus exit")
  rescue SystemExit
  p $!
  p $!.status
  end

  => #<SystemExit: bogus exit>
   1

success? ((<ruby 1.8 特性>))

  若结束状态值表示的是正常结束, 则返回true.

  begin
  exit(false)
  rescue SystemExit
  p $!
  p $!.status
  p $!.success?
  end

  # => #<SystemExit: exit>
   1
   false