Przekazano mi długo działający, starszy program rubinowy, który ma wiele wystąpień
begin
#dosomething
rescue Exception => e
#halt the exception's progress
end
przez cały czas.
Bez śledzenia każdego możliwego wyjątku, który każdy z nich mógłby obsługiwać (przynajmniej nie od razu), nadal chciałbym móc czasami go wyłączyć CtrlC.
Chciałbym to zrobić w sposób, który tylko dodaje do kodu (więc nie wpływam na istniejące zachowanie ani nie pomijam wychwyconego w inny sposób wyjątku w trakcie wykonywania).
[ CtrlCto SIGINT lub SystemExit, co wydaje się być równoważne z SignalException.new("INT")
systemem obsługi wyjątków Rubiego. class SignalException < Exception
, dlatego pojawia się ten problem.]
Kod, który chciałbym napisać, wyglądałby tak:
begin
#dosomething
rescue SignalException => e
raise e
rescue Exception => e
#halt the exception's progress
end
EDYCJA: Ten kod działa, o ile uzyskasz klasę wyjątku, który chcesz poprawnie przechwycić. To jest SystemExit, Interrupt lub IRB :: Abort, jak poniżej.
źródło
rescue SystemExit, Interrupt raise rescue Exception => e
Jeśli możesz opakować cały program, możesz zrobić coś takiego:
To zasadniczo CtrlCużywa catch / throw zamiast obsługi wyjątków, więc jeśli istniejący kod nie ma już catch: ctrl_c, powinno być dobrze.
Alternatywnie możesz zrobić
trap("SIGINT") { exit! }
.exit!
kończy działanie natychmiast, nie zgłasza wyjątku, więc kod nie może go przypadkowo przechwycić.źródło
SIGINT
działa dobrze dla mnie.Jeśli nie możesz zawinąć całej aplikacji w
begin ... rescue
blok (np. Thor), możesz po prostu przechwycićSIGINT
:130 to standardowy kod zakończenia.
źródło
130 | Script terminated by Control-C | Ctl-C | Control-C is fatal error signal 2, (130 = 128 + 2, see above)
)Używam
ensure
ze świetnym efektem! Dotyczy to rzeczy, które chcesz, aby się wydarzyły, gdy twoje rzeczy się kończą, bez względu na to, dlaczego się kończą.źródło
Czysta obsługa Ctrl-C w Rubim w sposób ZeroMQ:
Źródło
źródło