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

我有这段代码:

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

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

exception消息:执行已过期
exception回溯:/*** /ย/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:64:i

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

难道我做错了什么?

你的代码是正确的

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

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

尝试上面的基本代码。 如果可以,您在platform.search遇到问题。

问题是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 

根据文件 :

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

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

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