如何限制重试&;在这个Ruby示例中是什么?

如何限制重试&;在这个Ruby示例中是什么?,ruby,Ruby,在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次?会不会是这样的:

在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 }

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

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

只要在循环内成功编写一个
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
模块内核
def带_rescue(例外情况,重试次数:5次)
try=0
开始
屈服试验
rescue*异常=>exc
try+=1

try我使用此函数在间歇延迟的情况下运行并重试有限次数的命令。事实证明,
trys
参数可以简单地在函数体中进行扩充,并在调用
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

还不是很清楚,但这段摘录似乎很简单。谢谢,谢谢。我问这个问题的主要原因是为了理解如何,目前还没有一个实际的应用程序来处理这段代码。我知道这是一个古老的答案,但基本上是这样做的。我认为这个限制器应该是limiter | |=0,否则每次都会重置为0。
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