我觉得有点奇怪,因为有一些问题有点像这样,但不够接近,或者没有答案。

[编辑:我正在重新表述问题以使其更清楚]

我有一个循环可以做很多事情,并且正在使用它来查看各种选项是否可以使事情更易读、更清晰。最后,我搞砸了一些东西,它抛出了异常,被救援捕获了。到现在为止还挺好。但是,我无法找到任何方法让 ruby​​ 在循环的同一迭代中继续执行以下语句 - 异常总是导致以下语句,并且它继续进行下一次迭代 - 默认行为。重做或重试将毫无意义并导致无限循环,再次遇到相同的错误和异常等,

我有什么方法可以强制 ruby​​ 以某种方式处理错误,然后从停止的地方继续?

这是一个样本,从我不知道从哪里偷来并改编。

3.times do |i|
  begin
    # first bunch of stuff to do
    # second bunch of stuff to do
    # third bunch of stuff to do
    # fourth bunch of stuff to do
  rescue => e
    p e
  end
end

基本上,在这个例子中,我希望在进入循环的下一次迭代之前执行所有四组内容,即使其中一个会导致错误。我不是要处理错误,让我看到异常结果等,而是有效地忽略它并继续做所有其他的事情。

有任何想法吗?这可能是我以前从未见过的非常明显的事情。

最佳答案

您正在使用 begin-end 子句定义 rescue 块。如果块引发任何异常并且存在匹配的救援子句,则该块将停止执行并执行救援子句。如果没有匹配的救援块,错误会冒泡(并希望由另一个块处理,否则它将无法处理并且您的脚本将停止!)如果有 ensure 子句,即使有一个 ojit_code 子句,它也会运行异常(exception)。

那么,这让我们何去何从?如果您想防止单个步骤失败并继续执行,则每个步骤都需要自己的块:

3.times do |i|
  begin
    first_thing
  rescue => e
    puts "The first thing blew up! #{e.inspect}"
    puts "I'll carry on anyway ¯\\_(ツ)_/¯"
  end

  begin
    second_thing
    third_thing
  rescue => e
    puts "Either the second or third thing blew up... #{e.inspect}"
    puts "Straight on to the fourth thing!"
  end

  begin
    fourth_thing
  rescue => e
    puts "Fourth thing blew up! #{e.inspect}"
  end
end

如果出现问题,这样的块应该继续执行,这有点不寻常 - 这通常也是使下一步出错的好方法!您可能需要确保在每个点仍然具有数据完整性,并且后面的步骤不依赖于前面步骤中可能没有发生的事情。

关于ruby-on-rails - ruby:在异常后继续在同一个循环迭代中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45865387/

10-16 06:29