gpt4 book ai didi

ruby:在引发中断之前完成循环迭代

转载 作者:行者123 更新时间:2023-12-03 08:04:05 24 4
gpt4 key购买 nike

我正在循环很多项目,我想定期中断循环以保存并在以后继续,如下所示:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com