Ruby - 执行过期

时间:2011-06-14 06:51:42

标签: ruby exception-handling

我有一个像这样的红宝石代码:

begin
  doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
  log.error "Error: #{ex}"
end

我的日志是:

ERROR -- : Error: execution expired

我希望阻止重新执行,直到成功为止。

我该怎么办?

1 个答案:

答案 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来选择是否应该提供立即,等待并重试,或立即重试。