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

标签 ruby loops exception error-handling interrupt

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

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/

相关文章:

windows - FOR 循环内的 WHILE 循环批量

java - 构建Java库并捕获异常

c++ - 如何获取 'catch(...)'中的异常信息

ruby-on-rails - 任何人都有 Ruby on Rails 的 SEO 技巧

objective-c - Ruby ||= Objective-C 中的等价物

ruby - 从相同方法的 lib 文件中访问 Rails 模型名称

java - 嵌套循环听起来从头开始,从 1 开始递增。但它不

ruby-on-rails - :as in rails routes. rb

java - 嵌套循环产生特定输出

javascript - 如何在javascript中捕获异常?