ruby-on-rails - ruby:异常后继续进行相同的循环迭代

标签 ruby-on-rails ruby

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

[编辑:我正在改写问题以使其更清楚]

我有一个可以做很多事情的循环,我正在使用它看看各种选项是否可以使事情更易读、更清晰。最后,我搞砸了一些东西,它抛出了异常,被救援捕获了。到目前为止,一切都很好。但是,我无法找到任何方法让 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

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

有什么想法吗?这可能是我以前从未见过的非常明显的东西。

最佳答案

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

那么这会给我们留下什么?如果您想防止单个步骤失败并继续执行,则每个步骤都需要自己的 block :

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

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

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

相关文章:

javascript - 以 Rails 形式重置 Recaptcha

html - 在 View 内调用查询( Controller 操作)

ruby-on-rails - Rails after_save 回调被多次调用

ruby-on-rails - Rails 将 JSON 解析为哈希

ruby-on-rails - Rails 验证优先级

ruby - 这里为什么klass和const_get结合使用呢?

ruby - OptionParser 的 make_switch 错误为 '-?'

ruby-on-rails - ruby on rails 是如何工作的?

java - 使用不同语言的最佳实践是什么?

javascript - Ruby on Rails - 检查 Assets (.js) 的加载位置