2011-01-09 35 views
9

我有這段代碼:紅寶石超時::超時不火的異常,不返回什麼記錄

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假設爲超時狀態返回值(無論是true還是false,正如文檔中提到的那樣),肯定不是布爾值。

我做錯了什麼?

回答

19

你的代碼是正確的

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

並打印出 「打印我的東西,請」。

試試上面的基本代碼。如果可行,你在platform.search有問題。

+0

你確實是對的。我不知道爲什麼我沒有檢查platform.search。其實,搜索是搶救..例外...非常感謝! – Pasta 2011-01-09 02:42:15

1

根據the documentation

如果塊執行秒秒之前終止 已經過去,它 返回true。如果不是,則終止 執行併產生異常 (默認爲超時::錯誤)

這意味着只有當它的成功返回true,否則變量將不會被設置(即它是無不是假的)。

至於你的榜樣去,它肯定超時我和獲得救助的一部分...

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 
+1

超時::超時再次吸... – rogerdpack 2012-09-19 14:08:03