5

私はまだ Ruby を使い始めたばかりで、初めていくつかの HTTP 関数に Timeout を使用しようとしていますが、明らかにマークがどこかにありません。私のコードは以下にありますが、機能していません。代わりに、次の例外が発生します。

C:/Ruby193/lib/ruby/1.9.1/net/http.rb:762:in `initialize': execution expired (Timeout::Error)

タイムアウトしているコードの部分が begin/rescue/end ブロックにラップされ、具体的には Timeout::Error をレスキューするため、これはあまり意味がありません。何か間違っているのでしょうか、それとも Ruby でサポートされていないことでしょうか?

    retries = 10
    Timeout::timeout(5) do
      begin
        File.open("#{$temp}\\http.log", 'w') { |f|
          http.request(request) do |str|
            f.write str.body
          end
        }
      rescue Timeout::Error
        if retries > 0
          print "Timeout - Retrying..."
          retries -= 1
          retry
        else
          puts "ERROR: Not responding after 10 retries!  Giving up!")
          exit
        end
      end
    end
4

2 に答える 2

22

Timeout::Error呼び出しで が発生するため、ブロックTimeout::timeout内に配置する必要があります。begin

retries = 10
begin
  Timeout::timeout(5) do
    File.open("#{$temp}\\http.log", 'w') do |f|
      http.request(request) do |str|
        f.write str.body
      end
    end
  end
rescue Timeout::Error
  if retries > 0
    print "Timeout - Retrying..."
    retries -= 1
    retry
  else
    puts "ERROR: Not responding after 10 retries!  Giving up!")
    exit
  end
end
于 2012-08-02T03:21:06.767 に答える
3

これを簡単にするために retryable を使用します

https://github.com/nfedyashev/retryable#readme

require "open-uri"

retryable(:tries => 3, :on => OpenURI::HTTPError) do
  xml = open("http://example.com/test.xml").read
end
于 2013-06-11T12:08:16.060 に答える