第一次发生后超时不会重置

时间:2015-07-01 12:02:44

标签: ruby

我预计在以下代码中每30秒会发生一次超时:

def action_with_timeout(threshould, &block)
  begin
    Timeout::timeout(threshould) {block.call}
  rescue Exception => e
    ap("Timeout #{threshould}, stop loading pag, #{Time.now}")
    stop_loading_page
  end
end
while true
  action_with_timeout(30) {
    ap("to INDEX")
    browse_to(CONFIG["ROOT_URL"])
  }
end    

然而,它只是第一次有效。剩下的将在短时间内超时。输出是:

"Timeout 30, stop loading pag, 2015-07-01 19:59:10 +0800"
"Timeout 30, stop loading pag, 2015-07-01 19:59:13 +0800"
"Timeout 30, stop loading pag, 2015-07-01 19:59:16 +0800"
"Timeout 30, stop loading pag, 2015-07-01 19:59:19 +0800"

我该如何解决?

1 个答案:

答案 0 :(得分:1)

rescue Exception将拯救任何例外(这是bad idea)。

具体说明是为了挽救你感兴趣的例外:

require 'timeout'

def action_with_timeout(sec, &block)
  Timeout::timeout(sec, &block)
rescue Timeout::Error
  # ...
end

其他例外情况不会获救。这应该揭示你的实际问题。