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>