【问题标题】:uncaught exception with net/http request wrapper in rubyruby 中的 net/http 请求包装器未捕获的异常
【发布时间】:2012-03-30 08:32:16
【问题描述】:

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

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

感谢观看。

【问题讨论】:

    标签: ruby net-http


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-08
      • 2012-02-18
      • 2011-11-24
      • 2018-07-07
      • 2013-08-11
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多