2013-08-29 25 views
5

Tôi có đoạn code sau trong kịch bản của tôi ...của Ruby cứu và thử lại mã cụ thể khối

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 

Câu hỏi của tôi là những gì retry đang thực sự xảy ra để "thử lại". Nếu kịch bản đã tạo 1000 email trong một vòng lặp và gửi 999 email trong một vòng lặp khác, và sau đó nó sẽ gửi email thứ 1000- Nó sẽ thử lại dòng mã cụ thể mà nó gặp lỗi, nó sẽ bắt đầu vòng lặp hay không với email thứ 1000, nó sẽ bắt đầu toàn bộ vòng lặp, hay nó sẽ bắt đầu ở đầu tập lệnh chạy qua cả hai vòng lặp?

Tôi đang sử dụng ruby ​​1.9.3.

Trả lời

10

retry sẽ thực hiện khối toàn bộbegin, vì vậy trong trường hợp của bạn tất cả các vòng email sẽ chạy lại.

Dưới đây là một ví dụ nhanh, mà sẽ in các số nguyên từ 1 đến 7 liên tục (chấm dứt với Ctrl-C, vì nó sẽ Infinite Loop):

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

Thông tin cần biết. Cảm ơn đã giúp đỡ. – Luigi

+3

Đây là một bài viết thực sự tốt về cách sử dụng 'thử lại trong một vòng lặp http://blog.mirthlab.com/2012/05/25/cleanly-retrying-blocks-of-code-after-an-exception-in-ruby / – dennismonsewicz