2013-08-29 40 views
5

我在我的脚本如下代码...红宝石救援和重试特定的代码块

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封电子邮件,它是否会启动整个循环,还是会在通过两个循环运行的脚本开始处启动?

我正在使用红宝石1.9.3。

回答

10

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 
+0

好知道。谢谢您的帮助。 – Luigi

+3

这是一个非常好的帖子,在循环中使用'retry' http://blog.mirthlab.com/2012/05/25/cleanly-retrying-blocks-of-code-after-an-exception-in-ruby / – dennismonsewicz