繁体   English   中英

在这个Ruby示例中,如何限制重试和救援?

[英]How do you limit retry & rescue in this Ruby example?

在简陋的Ruby书中,提供了使用Rescue和retry的示例,使用以下代码将HTTP标头发送到服务器:

def make_request
  if (@http11)
    self.send('HTTP/1.1')
  else
    self.send('HTTP/1.0')
  end
rescue ProtocolError
  @http11 = false
  retry
end

要限制一个无限循环以防它无法解析,我必须插入什么代码才能重试5次? 会是这样的:

5.times { retry }

您可以在循环内部成功写入5 5.times以上的break ,或者抽象模式以使逻辑与循环分离。 一个主意:

module Kernel
  def with_rescue(exceptions, retries: 5)
    try = 0
    begin
      yield try
    rescue *exceptions => exc
      try += 1
      try <= retries ? retry : raise
    end
  end
end

with_rescue([ProtocolError], retries: 5) do |try|
  protocol = (try == 0) ? 'HTTP/1.1' : 'HTTP/1.0'
  send(protocol)
end

我使用此函数以间歇延迟运行和重试命令有限次数。 事实证明, tries参数可以简单地在函数体中进行扩充,并在调用retry时传递。

def run_and_retry_on_exception(cmd, tries: 0, max_tries: 3, delay: 10)
  tries += 1
  run_or_raise(cmd)
rescue SomeException => exception
  report_exception(exception, cmd: cmd)
  unless tries >= max_tries
    sleep delay
    retry
  end
end

您可以将变量设置为0并在每次重试时增加它,直到达到最大值,如下所示:

def make_request
  limiter = 0
  ...
rescue ProtocolError
  @http11 = false
  if limiter < MAXIMUM
    retry
  end
end

另外你可以自己尝试一下:

def make_request
  raise ProtocolError
rescue ProtocolError
  try_to_find_how_to_limit_it
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM