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実際に「再試行」することです。スクリプトが 1 つのループで既に 1000 通の電子メールを生成し、別のループで 999 通の電子メールを送信し、1000 番目の電子メールの送信でタイムアウトした場合、エラーが発生した特定のコード行を再試行しますか、ループを開始しますか? 1000 通目の電子メールで終了すると、ループ全体が開始されますか、それとも両方のループを実行するスクリプトの最初から開始されますか?

Ruby 1.9.3 を使用しています。

4

1 に答える 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
于 2013-08-29T19:05:49.557 に答える