我有这段代码:
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
假设是超时状态返回值(无论是真还是假,如文档中所提到的),绝对不是布尔值。
我做错了吗?
答案 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)
如果块执行终止 在秒秒过去之前,它 返回true。如果没有,它终止 执行并引发异常 (默认为Timeout :: Error)
这意味着它只有在成功时才返回true,否则变量将不会被设置(即它是nil not false)。
就你的例子而言,这对我来说绝对是时机,并且到救援部分......