SystemExit与其他Exception的行为有何不同?我想我明白为什么提出一个适当的例外是不好的。例如,你不希望发生这样奇怪的事情:

begin
  exit
rescue => e
  # Silently swallow up the exception and don't exit
end

但是rescue如何忽略SystemExit?(它使用什么标准?)

最佳答案

当您在没有一个或多个类的情况下编写rescue时,it is the same作为写入:

begin
  ...
rescue StandardError => e
  ...
end

但是,也有一些例外不是从StandardError继承的。SystemExit是其中之一,因此它不会被捕获。下面是Ruby1.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,它提供了自己的exit方法来屏蔽普通对象的exit。
1.8:
method :exit
#=> #<Method: Object(IRB::ExtendCommandBundle)#exit>

1.9:
method :exit
#=> #<Method: main.irb_exit>

07-26 06:50