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)。
就你的例子而言,这对我来说绝对超时并且到救援部分……