在ruby中捕获Ctrl-c

我通过了一个长期运行的遗产ruby程序,它有许多发生

begin
  #dosomething
rescue Exception => e
  #halt the exception's progress
end

遍及它。

没有跟踪每一个可能的异常,这些每个都可以处理(至少不是立即),我仍然想要能够关闭它有时用CtrlC。

我想这样做只是增加了代码(所以我不影响现有的行为,或错过一个在运行中途捕获的异常)。

[CtrlC是SIGINT或SystemExit,它看起来等效于Ruby的异常处理系统中的SignalException.new(“INT”)。 class SignalException<异常,这就是为什么这个问题出现了。] 我想写的代码是:

begin
  #dosomething
rescue SignalException => e
  raise e
rescue Exception => e
  #halt the exception's progress
end

编辑:这段代码工作,只要你得到你想要陷阱正确的异常的类。这是SystemExit,中断或IRB :: Abort如下。

问题是,当Ruby程序结束时,它通过提高SystemExit这样做。当控制C进来时,它引发中断。由于SystemExit和Interrupt都是从异常派生的,所以异常处理正在停止其轨道中的退出或中断。这里是修复:

只要你能,改变

rescue Exception => e
  # ...
end

rescue StandardError => e
  # ...
end

对于您不能更改为StandardError的那些,重新引发异常:

rescue Exception => e
  # ...
  raise
end

或者,至少,重新升级SystemExit和中断

rescue SystemExit, Interrupt
  raise
rescue Exception => e
  #...
end

您所做的任何自定义异常都应源自StandardError,而不是异常。

http://stackoverflow.com/questions/2089421/capturing-ctrl-c-in-ruby

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在ruby中捕获Ctrl-c