我觉得有点奇怪,因为有一些问题有点像这样,但不够接近,或者没有答案。
[编辑:我正在重新表述问题以使其更清楚]
我有一个循环可以做很多事情,并且正在使用它来查看各种选项是否可以使事情更易读、更清晰。最后,我搞砸了一些东西,它抛出了异常,被救援捕获了。到现在为止还挺好。但是,我无法找到任何方法让 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/