Me aprobaron un programa ruby heredado de larga duración, que tiene numerosas apariciones de
begin
#dosomething
rescue Exception => e
#halt the exception's progress
end
a lo largo de ella.
Sin rastrear todas y cada una de las posibles excepciones que cada uno podría manejar (al menos no de inmediato), aún me gustaría poder cerrarlo a veces con CtrlC.
Y me gustaría hacerlo de una manera que solo se agregue al código (para que no afecte el comportamiento existente o pierda una excepción detectada en medio de una ejecución).
[ CtrlCes SIGINT, o SystemSalir, que parece ser equivalente al SignalException.new("INT")
sistema de manejo de excepciones de Ruby. class SignalException < Exception
, por eso surge este problema.]
El código que me gustaría haber escrito sería:
begin
#dosomething
rescue SignalException => e
raise e
rescue Exception => e
#halt the exception's progress
end
EDITAR: Este código funciona, siempre que obtenga la clase de la excepción que desea capturar correctamente. Eso es SystemSalir, Interrupción o IRB :: Abort como se muestra a continuación.
fuente
rescue SystemExit, Interrupt raise rescue Exception => e
Si puede envolver todo su programa, puede hacer algo como lo siguiente:
Esto básicamente tiene CtrlCuso catch / throw en lugar de manejo de excepciones, por lo que a menos que el código existente ya tenga un catch: ctrl_c, debería estar bien.
Alternativamente, puede hacer un
trap("SIGINT") { exit! }
.exit!
sale inmediatamente, no genera una excepción por lo que el código no puede atraparlo accidentalmente.fuente
SIGINT
funciona bien para mí.Si no puede envolver toda su aplicación en un
begin ... rescue
bloque (por ejemplo, Thor), puede simplemente atraparSIGINT
:130 es un código de salida estándar.
fuente
130 | Script terminated by Control-C | Ctl-C | Control-C is fatal error signal 2, (130 = 128 + 2, see above)
)¡Estoy usando
ensure
con gran efecto! Esto es para las cosas que desea que sucedan cuando sus cosas terminen, sin importar por qué terminen.fuente
Manejar Ctrl-C limpiamente en Ruby al estilo ZeroMQ:
Fuente
fuente