Error 编号

如果你之前运行了 ensure.rb 程序并且你正密切关注,你可能已经发现了一些异常情况当你尝试登录不存在的驱动器(例如,在我的系统上可能是 “X:\” 驱动器)。通常,当一个异常发生时,异常类是特定命名类型的实例,如 ZeroDivisionError 或 NoMethodError。然而,在这种情况下,类异常显示为:

  1. Errno::ENOENT

事实证明,Ruby 中存在各种各样的 Errno 错误。试试 disk_err.rb。这里定义了一个方法 chDisk,它尝试登录由字符 aChar 标识的磁盘。因此,如果你传递 “A” 作为 chDisk 的参数,它将尝试登录 A:\ 驱动器。我调用了三次 chDisk 方法,每次都传递一个不同的字符串:

disk_err.rb
  1. chDisk( "D" )
  2. chDisk( "X" )
  3. chDisk( "ABC" )

在我的电脑上,D:\ 是我的 DVD 驱动器。目前它是空的,当我的程序尝试登录它时,Ruby 返回此类型的异常:

  1. Errno::EACCES

我的 PC 上没有 X:\ 驱动器,当我尝试登录时,Ruby 会返回此类型的异常:

  1. Errno::ENOENT

在最后一个示例中,我传递一个字符串参数 “ABC” 作为无效的磁盘标识符,Ruby 返回此类型的异常:

  1. Errno::EINVAL

此类型的错误是 SystemCallError 类的后代。你可以通过取消注释代码行来轻松的验证这一点,以显示 disk_err.rb 源代码中指示的类的族。

实际上,这些类包含底层操作系统返回的整数错误值。这里 Errno 是包含匹配相应整数错误值的常量(例如 EACCESENOENT)的模块的名称。

要查看 Errno 常量的完整列表,请运行以下命令:

  1. puts( Errno.constants )

要查看任何给定常量的相应数值,请将 ::Errno 追加到常量名称后面,如下所示:

  1. Errno::EINVAL::Errno
errno.rb

以下代码可用于显示所有 Errno 常量的列表及其数值:

  1. for err in Errno.constants do
  2. errnum = eval( "Errno::#{err}::Errno" )
  3. puts( "#{err}, #{errnum}" )
  4. end