me pasaron un programa legado rubí de larga data, que tiene numerosas apariciones deCaptura Ctrl-C en rubí
begin
#dosomething
rescue Exception => e
#halt the exception's progress
end
a través de ella.
Sin rastrear cada posible excepción éstas cada uno podría ser la manipulación (por lo menos no inmediatamente), todavía me gustaría ser capaz de apagarlo, a veces con CtrlC.
Y me gustaría hacerlo de una manera que sólo se suma al código (por lo que no afectan el comportamiento existente o se pierda una excepción de lo contrario recogido en el medio de una carrera.)
[CtrlC es SIGINT o SystemExit, que parece ser equivalente a SignalException.new("INT")
en el sistema de manejo de excepciones de Ruby. class SignalException < Exception
, por lo que este problema se presenta]
El código me gustaría haber escrito sería:.
begin
#dosomething
rescue SignalException => e
raise e
rescue Exception => e
#halt the exception's progress
end
EDIT: Este código funciona, siempre y cuando se obtiene la clase de la excepción quieres atrapar correctamente Eso es SystemExit, Interrupt o IRB :: Abort como se muestra a continuación.
Wayne, ¿sería tan amable de agregar un ejemplo IRB :: Abort a su lista también? –
@Tim, vaya a buscar irb.rb (en mi sistema, está en /usr/lib/ruby/1.8/irb.rb) y encuentre el ciclo principal (busque @ context.evaluate). Mire las cláusulas de rescate y creo que comprenderá por qué IRB se comporta de la manera en que lo hace. –
gracias. Ver la definición de #signal_handle en irb.rb también me ayudó a entenderlo. También tienen un buen truco dentro de la unión de la variable de excepción del bucle principal. (Utilizando las cláusulas de rescate como una forma de seleccionar una excepción específica, luego usando esa excepción fuera de los cuerpos de rescate.) –