我有一个像这样的红宝石代码:
begin
doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
log.error "Error: #{ex}"
end
我的日志是:
ERROR -- : Error: execution expired
我希望阻止重新执行,直到成功为止。
我该怎么办?
答案 0 :(得分:24)
我会稍微扩展一下我的评论。您可以使用retry
返回begin
:
begin
doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
log.error "Error: #{ex}"
retry
end
这将继续尝试(并记录错误),直到它工作或你手动杀死它。这可能不是你想要的,因为一个小错误会让你陷入无限循环。一个简单的方法就是让它尝试10次,然后放弃:
MAX_ATTEMPTS = 10
doc = nil
begin
doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
log.error "Error: #{ex}"
attempts = attempts + 1
retry if(attempts < MAX_ATTEMPTS)
end
if(doc.nil?)
# Do something about the persistent error
# so that you don't try to access a nil
# doc later on.
end
这样的事情会尝试几次然后放弃。如果您想在下一次尝试之前稍等一下,或者调查异常(可能有多个retry
块),您也可以在rescue
之前调用sleep
来选择是否应该提供立即,等待并重试,或立即重试。