在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 :(得分:17)
您可以在循环内部成功编写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
答案 1 :(得分:3)
您可以将变量设置为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
答案 2 :(得分:2)
我使用此函数以间歇延迟运行和重试命令有限次数。事实证明,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