10

我有这段代码:

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

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

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

所以我天真地认为我的呼叫超时了,但从未打印过“请打印我的东西”,并且complete_results这被认为是超时状态返回值(如文档中所述,真或假),绝对不是布尔值。

难道我做错了什么?

4

3 回答 3

21

你的代码是正确的

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

确实打印出“请给我打印一些东西”。

试试上面的基本代码。如果这有效,那么您在platform.search.

于 2011-01-09T02:33:28.500 回答
5

问题是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 
于 2012-05-14T13:18:31.817 回答
1

根据文档

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

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

就您的示例而言,这对我来说绝对是超时并进入救援部分......

于 2011-01-09T02:34:24.850 回答