【问题标题】:Ruby - Execution expiredRuby - 执行已过期
【发布时间】:2011-09-14 11:11:08
【问题描述】:

我有一个这样的 ruby​​ 代码:

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

我得到的日志是:

ERROR -- : Error: execution expired

我想重新执行块直到它成功。

我该怎么做?

【问题讨论】:

  • 首先尝试单独打开 url,将其传递给 nokogiri,因为这样可能更容易修复错误
  • 你的意思是这个?:doc = open(url).read.strip doc = Nokogiri::HTML(doc)
  • 不,我的意思是data = open(url).read.strip 然后在下一行doc = Nokogiri::HTML(data)
  • 如果你真的想从rescue回到begin,请使用retry(但要注意无限循环)。
  • 好的。我也想问你。但我忘了格式化code :)

标签: ruby exception-handling


【解决方案1】:

我会稍微扩展一下我的评论。你可以使用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

这样的事情会尝试几次然后放弃。如果您想在下一次尝试之前稍等片刻或调查异常(可能有多个rescue 块)以选择是否应该立即放弃,您也可以在retry 之前拨打sleep 电话,等待并重试,或立即重试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    相关资源
    最近更新 更多