2015-04-03 62 views
0

我打一个外部服务,做一些密码加密并返回几件事情。从连接重置救援由对等错误重试

现在,如果我要生成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 

但问题,我遇到的是,有些时候该服务仅返回在下面的错误一个循环,并退出的中间:

我的问题是如何从救援“由同行的错误连接复位”错误并重试几次而不会破坏程序的流程?

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

注:我使用的轨道2和Ruby 1.8.x的

回答

1

红宝石有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 

+0

如何如果出现该错误不,我只重试吗? – Micheal 2015-04-03 17:44:47

+0

救援块允许按异常类型过滤,将其添加到答案代码 – 2015-04-03 18:32:52

相关问题