Ruby-执行已过期

Ruby-执行已过期,ruby,exception-handling,Ruby,Exception Handling,我有这样一个ruby代码: begin doc = Nokogiri::HTML(open(url).read.strip) rescue Exception => ex log.error "Error: #{ex}" end 我得到的日志是: ERROR -- : Error: execution expired 我希望块重新执行,直到它成功 我怎么做 我将进一步阐述我的评论。您可以使用重试返回开始: begin doc = Nokogiri::HTML(open(ur

我有这样一个ruby代码:

begin
  doc = Nokogiri::HTML(open(url).read.strip)
rescue Exception => ex
  log.error "Error: #{ex}"
end
我得到的日志是:

ERROR -- : Error: execution expired
我希望块重新执行,直到它成功


我怎么做

我将进一步阐述我的评论。您可以使用
重试
返回
开始

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
最大尝试次数=10次
doc=零
开始
doc=Nokogiri::HTML(打开(url).read.strip)
营救异常=>ex
log.error“错误:#{ex}”
尝试次数=尝试次数+1
如果重试(尝试次数<最大尝试次数)
结束
如果(零号文件?)
#对持久性错误采取措施
#这样你就不会试图访问零
#博士稍后。
结束

像这样的东西会尝试几次,然后放弃。如果您想在下一次尝试之前稍等片刻,或者调查异常(可能有多个
rescue
块),您也可以在
重试
之前进行调用,以选择是立即放弃、等待并重试,还是立即重试。

首先尝试单独打开url,避免将其传递到nokogiri,由于这可能会使错误修复变得更容易,您的意思是:
doc=open(url)。read.strip doc=Nokogiri::HTML(doc)
No我的意思是
data=open(url)。read.strip
然后在下一行
doc=Nokogiri::HTML(data)
如果您真的想从
rescue
返回
开始,请使用
retry
(但要注意无限循环)。好的。我也试着问过你。但是我忘了格式化
代码
:)