从对等错误重置的连接中解救并重试

rescue from connection reset by peer error and retry

我正在访问一个外部服务,该服务执行一些密码加密和 returns 一些事情。

现在如果我想生成 50 个密码,我们 运行 这个函数循环 50 次

def self.encrypt_password(password)
    retries = 2
    uri = URI
    params = Base64.encode64(password)
    uri.query = URI.encode("Source=#{params}")
    begin    
      retries.times.each do
        res = Net::HTTP.get_response(uri)
        if res.is_a?(Net::HTTPSuccess)
          obj = JSON.parse(res.body)
          pw = Base64.decode64(obj["Data"])
          ps = Base64.decode64(obj["Key"])

          pws = Iconv.iconv('ascii', 'utf-16', pws)
          return pwe,pws[0]
        end 
      end
    rescue
      raise "Error generating pws: #{$!}"
    end
  end

但我遇到的问题是,有时服务只是 returns 在循环中间出现以下错误并退出:

"Connection reset by Peer error"

我的问题是如何在不中断程序流程的情况下解决该错误并重试几次?

或者有人可以为我的问题推荐替代解决方案吗?

注意:我在 rails 2 和 ruby 1 上使用 ruby。8.x

Ruby 有 retry 方法,可以在 rescue 子句中使用。

它只是再次运行当前方法,因此您可以使用计数器来限制重试次数:

def self.encrypt_password(password)
  retries = 2
  uri = URI
  params = Base64.encode64(password)
  uri.query = URI.encode("Source=#{params}")
  retries.times.each do
    res = Net::HTTP.get_response(uri)
    if res.is_a?(Net::HTTPSuccess)
      obj = JSON.parse(res.body)
      pw = Base64.decode64(obj["Data"])
      ps = Base64.decode64(obj["Key"])

      pws = Iconv.iconv('ascii', 'utf-16', pws)
      return pwe,pws[0]
    end 
  end
rescue SomeExceptionType
  if retries > 0
    retries -= 1
    retry
  else
    raise "Error generating pws: #{$!}"
  end
end

结束