Мне передали давно работающую устаревшую программу Ruby, в которой много раз встречается
begin
#dosomething
rescue Exception => e
#halt the exception's progress
end
повсюду.
Не отслеживая каждое возможное исключение, которое каждое из них может обрабатывать (по крайней мере, не сразу), я все равно хотел бы иметь возможность время от времени отключать его с помощью CtrlC.
И я хотел бы сделать это таким образом, чтобы только добавить к коду (чтобы я не влиял на существующее поведение и не пропускал иначе обнаруженное исключение в середине выполнения).
[ CtrlC- это SIGINT или SystemExit, что похоже на SignalException.new("INT")
систему обработки исключений Ruby. class SignalException < Exception
, поэтому возникает эта проблема.]
Код, который я хотел бы написать, был бы таким:
begin
#dosomething
rescue SignalException => e
raise e
rescue Exception => e
#halt the exception's progress
end
РЕДАКТИРОВАТЬ: этот код работает до тех пор, пока вы получаете класс исключения, которое хотите правильно перехватить. Это либо SystemExit, либо Interrupt, либо IRB :: Abort, как показано ниже.
источник
rescue SystemExit, Interrupt raise rescue Exception => e
Если вы можете обернуть всю свою программу, вы можете сделать что-то вроде следующего:
Это в основном CtrlCиспользует catch / throw вместо обработки исключений, поэтому, если в существующем коде уже есть catch: ctrl_c, все должно быть в порядке.
В качестве альтернативы вы можете сделать файл
trap("SIGINT") { exit! }
.exit!
немедленно завершается, исключение не возникает, поэтому код не может случайно его поймать.источник
SIGINT
у меня отлично работает.Если вы не можете заключить все свое приложение в
begin ... rescue
блок (например, Тор), вы можете просто перехватитьSIGINT
:130 - стандартный код выхода.
источник
130 | Script terminated by Control-C | Ctl-C | Control-C is fatal error signal 2, (130 = 128 + 2, see above)
)Пользуюсь
ensure
отлично! Это для вещей, которые вы хотите, чтобы произошло, когда ваши дела заканчиваются, независимо от того, почему они заканчиваются.источник
Чистая обработка Ctrl-C в Ruby the ZeroMQ:
Источник
источник