Ruby Timeout :: timeout不会触发Exception,也不会返回记录的内容

时间:2011-01-09 02:04:42

标签: ruby-on-rails ruby timeout rescue

我有这段代码:

begin
  complete_results = Timeout.timeout(4) do      
    results = platform.search(artist, album_name)
  end
rescue Timeout::Error
  puts 'Print me something please'
end 

然后我启动包含此代码的方法,好了,这是堆栈跟踪的开始:

Exception message :  execution expired
Exception backtrace :  /***/****/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:64:i

所以我天真地认为我的通话时间已经过去了。但是,“打印我喜欢的东西”永远不会被打印出来,complete_results假设是超时状态返回值(无论是真还是假,如文档中所提到的),绝对不是布尔值。

我做错了吗?

3 个答案:

答案 0 :(得分:20)

您的代码是正确的

require 'timeout'
begin
  complete_results = Timeout.timeout(1) do      
   sleep(2)
  end
rescue Timeout::Error
  puts 'Print me something please'
end

打印出来“请打印我的东西”。

尝试上述基本代码。如果可行,则platform.search中存在问题。

答案 1 :(得分:4)

问题是platform.search正在捕捉Timeout#timeout throws

的异常

你可以通过将内部代码包装在另一个线程中来解决这个问题 - YMMV。

begin
  complete_results = Timeout.timeout(4) do
    Thread.new{ results = platform.search(artist, album_name) }.value
  end
rescue Timeout::Error
  puts 'Print me something please'
end 

答案 2 :(得分:1)

根据the documentation

  

如果块执行终止   在秒秒过去之前,它   返回true。如果没有,它终止   执行并引发异常   (默认为Timeout :: Error)

这意味着它只有在成功时才返回true,否则变量将不会被设置(即它是nil not false)。

就你的例子而言,这对我来说绝对是时机,并且到救援部分......