【发布时间】:2017-11-29 06:16:45
【问题描述】:
我正在循环很多项目,我想定期中断循环以保存并在以后继续,如下所示:
begin
big_list.each do |i|
# sensitive stuff
sensitive_method(i)
# other sensitive stuff
end
rescue Interrupt
# finish the current iteration
# then do something else (save)
# don't raise (print done)
end
敏感是指,如果在迭代过程中引发Interrupt,数据将被破坏,因此我需要保证迭代在退出之前完成。
此外,如果引发另一个异常,它仍应完成循环但随后引发它
编辑:
在测试场景中使用 mudasobwa 的答案:
while true
result = begin
puts "start"
sleep 1
puts "halfway"
sleep 1
puts "done\n\n"
nil
rescue Exception => e
e
end
case result
when Interrupt
puts "STOPPED"
break
when Exception then raise result
end
end
我明白了:
start
halfway
done
start
^C: /...
STOPPED
这是我的确切问题,我需要它来完成循环(睡眠、打印中途、睡眠、打印完成)然后才爆发(包装放置、睡眠......在一个方法中没有帮助)
【问题讨论】:
-
你可以在循环内移动
begin..rescue -
你应该在
sensitive_method中拯救Interrupt否则当你在循环之外拯救它时,你必须重新启动/调用该方法调用。然后从sensitive_method中引发关闭错误/方法(假设一切都是同步的)。 -
@Anthony 好的,但是如果我中断,方法体不会中途停止执行,这就是我要避免的
标签: ruby loops exception error-handling interrupt