2

FacebookのテストAPIを呼び出して、テストアカウントの作成を自動化するスクリプトがあります。一見ランダムな間隔で、50リクエスト後から6000リクエストまで、キャッチされない例外が発生します。エラーが何であるかを理解する方法がわからないので、ここで関連するコードから始めます。

FacebookのキーにはRuby1.8.7のURI.parseを壊すパイプ文字が含まれているため、URIライブラリを使用していません。

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

コードはしばらくの間機能しますが、常に次のことを報告します。

in rescue in request_wrapper': undefined method-@'for nil:NilClass(NoMethodError)

この未定義のメソッド'-@'を見たことがありますか?繰り返しますが、これは非常に断続的に発生しますが、それは私の側の本当のとげでした。これは常に、リクエストラッパーを呼び出しているコード内の行を指しています。

ご覧いただきありがとうございます。

4

1 に答える 1

3

問題は行にありretry_count--ます。この行は、失敗した HTTP 要求によって が発生した場合にのみ評価されますException。これは、断続的に発生する理由を説明しています。

--Ruby には、単項デクリメント ( ) またはインクリメント ( ) 演算子がありません++。Matz は、この背後にある哲学的理由をここで概説しています。詳細については、このスレッドこのスレッドも参照してください。

代わりにretry_count -= 1、仕事をするべきです。

于 2012-03-13T21:36:35.683 に答える