Ruby异常文档

4
1个回答

6
Ruby无法保证会抛出哪个异常。用户可能发送中断,文件系统可能无法写入等等。Ruby对此不做任何保证。但对于文件操作,我可能会首先查看IOError及其子类EOFError。
这可以提供处理非异常(可以合理预期的)事件的能力,例如文件不存在,没有读取权限或没有写入权限等等。您可以编写程序来处理这些事情,并尝试进行救援和处理。
您还可以编写自己的异常,引发自定义异常(可能继承StandardError),并给出适当的操作或反馈。
这是使用Ruby 1.9.3-p327从我的计算机生成的当前异常层次结构。
BasicObject
  Exception
    NoMemoryError
    ScriptError
      LoadError
        Gem::LoadError
      NotImplementedError
      SyntaxError
    SecurityError
    SignalException
      Interrupt
    StandardError
      ArgumentError
      EncodingError
        Encoding::CompatibilityError
        Encoding::ConverterNotFoundError
        Encoding::InvalidByteSequenceError
        Encoding::UndefinedConversionError
      FiberError
      IOError
        EOFError
      IndexError
        KeyError
        StopIteration
      LocalJumpError
      Math::DomainError
      NameError
        NoMethodError
      RangeError
        FloatDomainError
      RegexpError
      RuntimeError
        Gem::Exception
          Gem::CommandLineError
          Gem::DependencyError
          Gem::DependencyRemovalException
          Gem::DocumentError
          Gem::EndOfYAMLException
          Gem::FilePermissionError
          Gem::FormatException
          Gem::GemNotFoundException
          Gem::GemNotInHomeException
          Gem::InstallError
          Gem::InvalidSpecificationException
          Gem::OperationNotSupportedError
          Gem::RemoteError
          Gem::RemoteInstallationCancelled
          Gem::RemoteInstallationSkipped
          Gem::RemoteSourceException
          Gem::VerificationError
      SystemCallError
      ThreadError
      TypeError
      ZeroDivisionError
    SystemExit
      Gem::SystemExitException
    SystemStackError
    fatal

一般来说,在Ruby中处理异常的最佳方式是什么?由于文档从未提到可能引发的任何异常,我们如何捕获细粒度的异常呢?如果我们捕获根对象,即Exception,我认为这会太笼统了(可能会处理方法不应该处理的内容)。 - Pahlevi Fikri Auliya
这可能是一个相当不错的新问题。它足够通用以提供帮助,也许并没有澄清当前的问题。但简而言之,假设您想要捕获用户中断。我们可以救援SignalException,但那将会救援其他我们可能不想救援的异常。因此,我们看一下表格中显示的子异常,即Interrupt。现在,我们可以优雅地关闭程序,在这种情况下,您可能会让某人按ctrl-c - vgoff
1
仅供参考:在处理UNIX信号时最好使用“trap”。 - Simon Perepelitsa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接