2013-08-29 4 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-м электронным письмом, начнет ли он весь цикл, или начнется ли он в начале скрипта, проходящего через оба цикла?

Я использую ruby ​​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