SystemCallError

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

超类:

类方法:

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 特性>))

otherSystemCallError的子类时为真. (与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.