Ruby中如何针对特定的代码块进行异常处理和重试

8
我在脚本中有以下代码...
  begin
    #Loop to create 1000 emails...
    #Loop to send 1000 emails...

  rescue Timeout::Error => e
    retry_attempts += 1
    if retry_attempts < 10
      retry
    else
      puts "Timeout error, deleting emails...".red
      logs.puts("Rescued a timeout error...#{e}")
      email_ids_all.each do |email_delete|
        #delete all email...
      end

我的问题是,retry实际上会“重试”什么。如果脚本在一个循环中已经生成了1000封电子邮件,并在另一个循环中发送了999封邮件,然后在发送第1000封电子邮件时超时-它会重试遇到错误的特定代码行,它会从第1000封电子邮件重新开始循环,它会重新开始整个循环,还是它将从脚本运行通过两个循环的开头开始?我正在使用ruby 1.9.3。
1个回答

13

retry 会执行整个 begin 块,所以在您的情况下,所有 的电子邮件循环都将再次运行。

这是一个快速示例,它将连续打印整数 1 到 7(使用 CTRL-C 终止,因为它将无限循环):

begin
  (1..10).each do |x|
    puts x
    if x > 6
      STDIN.gets # press enter to do another iteration
      raise ArgumentException
    end
  end
rescue
  retry # loop will restart from 1
end

3
这是一篇关于如何在循环中使用 retry 的好文章,你可以点击链接 http://blog.mirthlab.com/2012/05/25/cleanly-retrying-blocks-of-code-after-an-exception-in-ruby/ 阅读。 - dennismonsewicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接