J'ai reçu un programme ruby hérité de longue date, qui a de nombreuses occurrences de
begin
#dosomething
rescue Exception => e
#halt the exception's progress
end
partout.
Sans rechercher toutes les exceptions possibles, celles-ci pourraient être gérées (du moins pas immédiatement), j'aimerais toujours pouvoir l'arrêter parfois CtrlC.
Et j'aimerais le faire d'une manière qui ne fait qu'ajouter au code (donc je n'affecte pas le comportement existant, ou je rate une exception autrement capturée au milieu d'une exécution.)
[ CtrlCest SIGINT, ou SystemExit, qui semble être équivalent à SignalException.new("INT")
dans le système de gestion des exceptions de Ruby. class SignalException < Exception
, c'est pourquoi ce problème se pose.]
Le code que j'aimerais avoir écrit serait:
begin
#dosomething
rescue SignalException => e
raise e
rescue Exception => e
#halt the exception's progress
end
EDIT: Ce code fonctionne, tant que vous obtenez la classe de l'exception que vous souhaitez intercepter correctement. C'est soit SystemExit, Interrupt ou IRB :: Abort comme ci-dessous.
la source
rescue SystemExit, Interrupt raise rescue Exception => e
Si vous pouvez encapsuler tout votre programme, vous pouvez faire quelque chose comme ce qui suit:
Cela CtrlCutilise essentiellement catch / throw au lieu de la gestion des exceptions, donc à moins que le code existant ne contienne déjà un catch: ctrl_c, cela devrait aller.
Vous pouvez également faire un
trap("SIGINT") { exit! }
.exit!
se termine immédiatement, il ne lève pas d'exception, donc le code ne peut pas l'attraper accidentellement.la source
SIGINT
fonctionne très bien pour moi.Si vous ne pouvez pas envelopper toute votre application dans un
begin ... rescue
bloc (par exemple, Thor), vous pouvez simplement piégerSIGINT
:130 est un code de sortie standard.
la source
130 | Script terminated by Control-C | Ctl-C | Control-C is fatal error signal 2, (130 = 128 + 2, see above)
)J'utilise
ensure
à bon escient! C'est pour les choses que vous voulez faire se produire lorsque vos affaires se terminent, peu importe pourquoi elles se terminent.la source
Manipuler proprement Ctrl-C dans Ruby à la manière ZeroMQ:
La source
la source