Eu fui aprovado em um programa de ruby antigo, que tem inúmeras ocorrências de
begin
#dosomething
rescue Exception => e
#halt the exception's progress
end
em todo ele.
Sem rastrear todas as exceções possíveis com que cada um deles poderia lidar (pelo menos não imediatamente), eu ainda gostaria de poder desligá-lo às vezes com CtrlC.
E eu gostaria de fazer isso de uma forma que apenas acrescente ao código (para não afetar o comportamento existente, ou perder uma exceção detectada no meio de uma execução).
[ CtrlCé SIGINT, ou SystemExit, que parece ser equivalente ao SignalException.new("INT")
sistema de tratamento de exceções do Ruby. class SignalException < Exception
, é por isso que esse problema surge.]
O código que eu gostaria de ter escrito seria:
begin
#dosomething
rescue SignalException => e
raise e
rescue Exception => e
#halt the exception's progress
end
EDIT: Este código funciona, contanto que você obtenha a classe da exceção que deseja corrigir com interceptação. Pode ser SystemExit, Interrupt ou IRB :: Abort conforme abaixo.
fonte
rescue SystemExit, Interrupt raise rescue Exception => e
Se você pode embrulhar todo o seu programa, você pode fazer algo como o seguinte:
Basicamente, ele CtrlCusa catch / throw ao invés de manipulação de exceção, então, a menos que o código existente já tenha um catch: ctrl_c nele, ele deve funcionar.
Alternativamente, você pode fazer a
trap("SIGINT") { exit! }
.exit!
sai imediatamente, ele não levanta uma exceção, portanto, o código não pode detectá-lo acidentalmente.fonte
SIGINT
funciona bem para mim.Se você não pode agrupar todo o seu aplicativo em um
begin ... rescue
bloco (por exemplo, Thor), você pode apenas capturarSIGINT
:130 é um código de saída padrão.
fonte
130 | Script terminated by Control-C | Ctl-C | Control-C is fatal error signal 2, (130 = 128 + 2, see above)
)Estou usando
ensure
com grande efeito! Isso é para coisas que você deseja que aconteçam quando suas coisas terminarem, não importa por que acabem.fonte
Manuseando Ctrl-C de forma limpa em Ruby da maneira ZeroMQ:
Fonte
fonte