2011-01-09 6 views
9

Ich habe dieses Stück Code:Ruby-Timeout :: Timeout nicht Feuer Ausnahme und nicht zurück, was dokumentiert

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

ich dann die Methode starten diesen Code enthält, und auch hier ist der Anfang eines Stack-Trace:

 
Exception message : execution expired 
Exception backtrace : /***/****/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:64:i 

Also ich naiv denkt, dass mein Anruf Timeout. Aber "Druck mir etwas bitte" wird nie gedruckt und complete_results was ist der Timeout-Status Rückgabewert (entweder wahr oder falsch, wie in der Dokumentation erwähnt), ist definitiv kein Boolean.

Mache ich etwas falsch?

Antwort

19

Ihr Code korrekt

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

"etwas drucken Sie mir bitte" nicht ausdrucken.

Versuchen Sie den Basiscode wie oben. Wenn das funktioniert, haben Sie ein Problem in platform.search.

+0

Sie hatten definitiv Recht. Ich weiß nicht, warum ich platform.search nicht überprüft habe. Eigentlich war die Suche Rettung. Ausnahme ... Vielen Dank! – Pasta

1

Nach the documentation:

Wenn die Blockausführung vor sec Sekunden beendet ist vergangen, es gibt true zurück. Wenn nicht, es beendet die Ausführung und hebt Ausnahme (die standardmäßig Timeout :: Fehler)

Das bedeutet, es nur true zurück, wenn es erfolgreich ist, ansonsten wird die Variable nicht (dh eingestellt werden, es ist null nicht falsch).

Soweit Ihr Beispiel geht, wird es auf jeden Fall Timing für mich und zur Rettung Teil bekommen ...

4

Das Problem ist, dass platform.search dass Timeout#timeout throws die Ausnahme ist, zu kontrollieren.

Sie können umgehen, indem Sie Ihren inneren Code in einem anderen Thread - 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

Timeout :: Timeout saugt wieder ... – rogerdpack

+2

Ich habe dieses Problem kürzlich beschrieben und möglicherweise behoben: http://code.jjb.cc/2012/09/15/sane_timeout-a-replacement-for-rubys- standard-library-timeout/ –

+0

Zeitüberschreitung macht zwar Spaß, aber dieser Threading-Ansatz funktioniert gut, danke –

Verwandte Themen