红宝石 – SystemExit是一种特殊的异常?

前端之家收集整理的这篇文章主要介绍了红宝石 – SystemExit是一种特殊的异常?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
SystemExit与其他异常的行为有何不同?我认为我理解了为什么提出适当的例外不太好的一些推理.例如,你不会想要这样的奇怪的事情发生:
begin
  exit
rescue => e
  # Silently swallow up the exception and don't exit
end

但是如何抢救SystemExit呢? (它使用什么标准?)

解决方法

当你写一个没有一个或多个课程的救援,it is the same写作:
begin
  ...
rescue StandardError => e
  ...
end

但是,有例外不会继承自StandardError. SystemExit是其中的一个,所以没有被捕获.这是Ruby 1.9.2中的层次结构的一个子集,您可以通过它find out yourself

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
      NameError
        NoMethodError
      RangeError
        FloatDomainError
      RegexpError
      RuntimeError
      SystemCallError
      ThreadError
      TypeError
      ZeroDivisionError
    SystemExit
    SystemStackError
    fatal

您可以通过以下方式捕获SystemExit:

begin
  ...
rescue SystemExit => e
  ...
end

…或者您可以选择捕获每个异常,包括SystemExit:

begin
  ...
rescue Exception => e
  ...
end

自己尝试一下:

begin
  exit 42
  puts "No no no!"
rescue Exception => e
  puts "Nice try,buddy."
end
puts "And on we run..."

#=> "Nice try,buddy."
#=> "And on we run..."

请注意,此示例将无法使用(某些版本的?)IRB,它提供了自己的退出方法来掩盖普通的对象#退出.

1.8.7:

method :exit
#=> #<Method: Object(IRB::ExtendCommandBundle)#exit>

在1.9.3:

method :exit
#=> #<Method: main.irb_exit>
原文链接:https://www.f2er.com/ruby/273155.html

猜你在找的Ruby相关文章