2

我有一个脚本调用 facebook 测试 api 来自动创建测试帐户。在看似随机的时间间隔内,从 50 个请求到 6000 个请求,我得到一个未被捕获的异常。我不知道如何找出错误是什么,所以我将从这里的相关代码开始。

我没有使用 URI 库,因为 facebook 键的管道字符会破坏 ruby​​ 1.8.7 的 URI.parse。

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-@' 中为 nil:NilClass (NoMethodError)

以前有人见过这个未定义的方法'-@'吗?再一次,这种情况非常间歇性地发生,但它确实是我身边的一根刺。它总是指向我调用请求包装器的代码行。

谢谢参观。

4

1 回答 1

3

问题出在线路上retry_count--。仅当失败的 HTTP 请求引发 时才评估此行Exception,这解释了它为什么会间歇性发生。

Ruby 没有一元递减 ( --) 或递增 ( ++) 运算符。Matz 在这里概述了这背后的哲学原因。另请参阅此线程线程以获取更多信息。

相反,retry_count -= 1应该做的工作。

于 2012-03-13T21:36:35.683 回答