2013-08-29 19 views
5

Mam następujący kod w moim skrypcie ...Ruby ratowniczy i ponowić blok specyficzny kod

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 

Moje pytanie brzmi: co retry faktycznie zamiar „powtórzyć”. Jeśli skrypt wygenerował już 1000 wiadomości e-mail w jednej pętli i wysłał 999 z nich w innej pętli, a następnie przekroczył limit czasu na wysłanie 1000-tej wiadomości e-mail - Czy ponownie spróbuje określonej linii kodu, na którą napotkał błąd, uruchomi pętlę z 1000-em e-mailem, czy rozpocznie on całą pętlę, czy rozpocznie się na początku skryptu przechodzącego przez obie pętle?

Używam ruby ​​1.9.3.

Odpowiedz

10

retry wykona blok całybegin, więc w Twoim przypadku wszystko pętle e-mail zostanie uruchomiony ponownie.

Oto krótki przykład, który wypisze liczby całkowite od 1 do 7 w sposób ciągły (zakończyć z CTRL-C, jak będzie to pętla nieskończona):

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

Dobrze wiedzieć. Dzięki za pomoc. – Luigi

+3

Oto naprawdę dobry wpis na temat używania 'retry' w pętli http://blog.mirthlab.com/2012/05/25/cleanly-retrying-blocks-of-code-after-an-exception-in-ruby / – dennismonsewicz

Powiązane problemy