необработанное исключение с оболочкой net / http request в ruby - PullRequest
2 голосов
/ 14 марта 2012

У меня есть скрипт, который вызывает тестовый API Facebook для автоматизации создания тестовой учетной записи. Через, казалось бы, случайный интервал, от 50 до 6000 запросов, я получаю исключение, которое не перехватывается. Я не знаю, как выяснить, в чем заключается ошибка, поэтому я начну с соответствующего кода здесь.

Я не использую библиотеку URI, потому что ключи facebook имеют символ канала, который разрывает URI.parse для ruby ​​1.8.7.

require 'rubygems'
require 'net/https'
require 'json'



http = Net::HTTP.new(domain, 443)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

def request_wrapper(http, request)
  retry_count = 5
  begin
    return http.request(request)
    rescue Exception => e
    retry_count--
    if retry_count < 0
      raise e
    end
  retry
end



for i in 0..500 do
    request = Net::HTTP::Get.new('https://' + domain + path)
    response = request_wrapper(http, request)
end

Код будет работать некоторое время, но всегда неизбежно сообщает следующее:

в rescue in request_wrapper': undefined method - @ 'для ноля: NilClass (NoMethodError) * +1010 *

Кто-нибудь когда-либо видел этот неопределенный метод '- @' раньше? Опять же, это происходит очень периодически, но это была настоящая бельма на моей стороне. Он всегда указывает на строку в коде, где я вызываю оболочку запроса.

Спасибо, что заглянули.

1 Ответ

3 голосов
/ 14 марта 2012

Проблема со строкой retry_count--. Эта строка оценивается только тогда, когда сбой HTTP-запроса вызывает Exception, что объясняет, почему это происходит с перебоями.

В Ruby отсутствует унарный оператор (--) или приращение (++). Мац изложил философские причины этого здесь . Также см. этот поток и этот для получения дополнительной информации.

Вместо этого retry_count -= 1 должен выполнить работу.

...