Урок 13-2 Ошибка связанная с get_response (часть 2)

[Д] Дмитрий, 21 июля 2016, 19:51 , 3 подписчика

Теперь вылезает такая ошибка:

C:/Ruby22/lib/ruby/2.2.0/net/protocol.rb:153:in `read_nonblock': end of file reached (EOFError)
        from C:/Ruby22/lib/ruby/2.2.0/net/protocol.rb:153:in `rbuf_fill'
        from C:/Ruby22/lib/ruby/2.2.0/net/protocol.rb:134:in `readuntil'
        from C:/Ruby22/lib/ruby/2.2.0/net/protocol.rb:144:in `readline'
        from C:/Ruby22/lib/ruby/2.2.0/net/http/response.rb:39:in `read_status_line'
        from C:/Ruby22/lib/ruby/2.2.0/net/http/response.rb:28:in `read_new'
        from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:1414:in `block in transport_request'
        from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:1411:in `catch'
        from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:1411:in `transport_request'
        from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:1384:in `request'
        from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:1285:in `request_get'
        from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:480:in `block in get_response'
        from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:853:in `start'
        from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:583:in `start'
        from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:478:in `get_response'
        from prognoz.rb:27:in `<main>'

Пробовал гуглить, пишут что не с первого раза может дойти запрос. Попробовал несколько раз запустить в терминале прогу и на 4-й раз она запустилась. А можно избавиться совсем от этой проблемы?

Обсуждение (5)


Вадим Венедиктов Учитель

[В]

Исходники! Нужно посмотреть исходники. Либо прикрепи свою программу, либо, если ты запускаешь нашу, скажи, какую именно и с какими параметрами.


Вадим Венедиктов Учитель

[В]

Ну как ты, наверное, помнишь, можно схватить эту ошибку и в самой программе повторить запрос в случае, если ошибка именно EOFError.

Можно дополнительно сделать счётчик retry_count, чтобы программа не ушла в бесконечную отправку запросов.

MAX_RETRY_COUNT = 10
RETRY_DELAY = 2
retry_count = 0

begin EOFError
  # Отправляем запрос по адресу uri и сохраняем результат в переменную response
  response = Net::HTTP.get_response(uri)
rescue
  if retry_count < MAX_RETRY_COUNT
    sleep RETRY_DELAY
    retry_count += 1
    retry
  else
    raise
  end
end

Если это проблема действительно на стороне Яндекса, это лучшее, что ты можешь поделать, наверное.


Вадим Венедиктов Учитель

[В]

Например, для Москвы программа лезет вот сюда:

https://export.yandex.ru/weather-ng/forecasts/27612.xml

И этот url действительно доступен через раз (пробовал в браузере).


Michael Butlitsky Учитель

[M]

У Яндекса последнее время проблемы с погодным API, мы списались с ними, обещают починить. И починили, но видимо еще бывают глюки.