Cuando se escribe rescue
sin una o más clases, como la escritura: it is the same
begin
...
rescue StandardError => e
...
end
hay excepciones que no se heredan de StandardError
, sin embargo. SystemExit
es uno de estos, por lo que no se captura. Aquí es un subconjunto de la jerarquía en Ruby 1.9.2, que se puede 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
este modo puede capturar simplementeSystemExit
con:
begin
...
rescue SystemExit => e
...
end
... o puede optar por capturar todos los excepción, incluyendo SystemExit
con:
begin
...
rescue Exception => e
...
end
Inténtelo usted mismo:
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..."
Tenga en cuenta que este ejemplo no funcionará en (algunas versiones de?) IRB, que suministra su propio método de salida que enmascara el objeto # normal de salida.
En 1.8.7:
method :exit
#=> #<Method: Object(IRB::ExtendCommandBundle)#exit>
En 1.9.3:
method :exit
#=> #<Method: main.irb_exit>
Esto tiene que ser un duplicado. –
@AndrewGrimm Ciertamente es una pregunta frecuente de la lista de correo y el IRC, pero no puedo encontrar esta pregunta exactamente en S/O. Lo más cerca que encontré fue _ ["¿Qué excepciones captas cuando no especificas una clase de excepción en Ruby?] (Http://stackoverflow.com/questions/2748515/which-exceptions-do-you-catch-when -you-dont-specified-a-exception-class-in-ruby) _, pero es una especie de respuesta duplicada, no duplicada. – Phrogz
@Andrew Pensé que alguien más tenía que haber preguntado lo mismo también, pero no encontré nada que respondiera específicamente cómo se maneja 'SystemExit'. @Phrogz Gracias por el enlace a la Q. relacionada. –