若系统调用失败的话,就会引发该异常. 实际上,它并非是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 特性>))当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.