在ruby中使用net / http请求包装器进行未捕获的异常

时间:2012-03-13 21:34:27

标签: ruby net-http

我有一个脚本调用facebook test 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)

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

谢谢你看看。

1 个答案:

答案 0 :(得分:3)

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

Ruby没有一元递减(--)或递增(++)运算符。 Matz概述了here背后的哲学原因。另请参阅this threadthis one以获取更多信息。

相反,retry_count -= 1应该完成这项工作。