我正在循环很多项目,我想定期中断循环以保存并在以后继续,如下所示:
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
这是我的确切问题,我需要它来完成循环( sleep ,中途打印, sleep ,打印完成)然后才爆发(包装放置, sleep ......在一种方法中没有帮助)
最佳答案
TL;DR: 无法从中间继续执行该方法。
big_list.each do |i|
# sensitive stuff
result = begin
sensitive_method(i)
nil
rescue Exception => e
e
end
# other sensitive stuff
case result
when Interrupt
puts "done"
break "done"
when Exception then raise result
end
end
旁注:你可能不想拯救最上面的
Exception
,但是一些对救援有意义的子类。为了使完成大量操作成为可能:
operations = [
-> { puts "start" },
-> { sleep 1 },
-> { puts "halfway" },
-> { sleep 1 },
-> { puts "done\n\n" }
]
def safe_chunk(operations, index = 0)
result = operations[index..-1].each_with_index(index) do |op, idx|
begin
op.()
rescue Exception => e
safe_chunk(operations, idx) # or idx + 1
break e
end
end
result.is_a?(Array) ? nil : result
end
关于ruby:在引发中断之前完成循环迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44759176/