Mir wurde ein langjähriges Legacy-Ruby-Programm übergeben, das zahlreiche Vorkommen hat
begin
#dosomething
rescue Exception => e
#halt the exception's progress
end
überall.
Ohne jede mögliche Ausnahme aufzuspüren, die diese behandeln könnten (zumindest nicht sofort), möchte ich sie trotzdem manchmal herunterfahren können CtrlC.
Und ich möchte dies auf eine Weise tun, die nur zum Code beiträgt (damit ich das vorhandene Verhalten nicht beeinträchtige oder eine ansonsten abgefangene Ausnahme während eines Laufs verpasse.)
[ CtrlCist SIGINT oder SystemExit, was SignalException.new("INT")
dem Ausnahmebehandlungssystem von Ruby zu entsprechen scheint . class SignalException < Exception
, weshalb dieses Problem auftritt.]
Der Code, den ich gerne geschrieben hätte, wäre:
begin
#dosomething
rescue SignalException => e
raise e
rescue Exception => e
#halt the exception's progress
end
BEARBEITEN: Dieser Code funktioniert, solange Sie die Klasse der Ausnahme erhalten, die Sie korrekt abfangen möchten. Das ist entweder SystemExit, Interrupt oder IRB :: Abort wie unten.
quelle
rescue SystemExit, Interrupt raise rescue Exception => e
Wenn Sie Ihr gesamtes Programm einpacken können, können Sie Folgendes tun:
Grundsätzlich wird CtrlCanstelle der Ausnahmebehandlung catch / throw verwendet. Sofern der vorhandene Code nicht bereits einen catch: ctrl_c enthält, sollte dies in Ordnung sein.
Alternativ können Sie eine
trap("SIGINT") { exit! }
.exit!
Wird sofort beendet, löst es keine Ausnahme aus, sodass der Code sie nicht versehentlich abfangen kann.quelle
SIGINT
funktioniert gut für mich.Wenn Sie nicht Ihre gesamte Anwendung in einen
begin ... rescue
Block einschließen können (z. B. Thor), können Sie einfach Folgendes abfangenSIGINT
:130 ist ein Standard-Exit-Code.
quelle
130 | Script terminated by Control-C | Ctl-C | Control-C is fatal error signal 2, (130 = 128 + 2, see above)
)Ich benutze
ensure
mit großer Wirkung! Dies ist für Dinge, die passieren sollen, wenn Ihre Sachen enden, egal warum sie enden.quelle
Sauberer Umgang mit Strg-C in Ruby ZeroMQ-Weise:
Quelle
quelle