2011-01-09 13 views
9

tengo este pedazo de código:Rubí Tiempo de espera :: tiempo de espera no hace excepción por incendio y no vuelve lo documentado

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

entonces lanzar el método que contiene este código, y bueno, aquí está el comienzo de un seguimiento de la pila:

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

Así que piensa ingenuamente que mi llamada timeouted. Pero "Imprimir algo por favor" nunca se imprime y complete_results, que se supone que es el valor de retorno del estado de tiempo de espera (ya sea verdadero o falso, como se menciona en la documentación), definitivamente no es un booleano.

¿Estoy haciendo algo mal?

Respuesta

19

Su código es correcto

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

no imprimir "Imprimir algo por favor".

Pruebe el código básico como se indica anteriormente. Si eso funciona, tienes un problema en platform.search.

+0

Tienes razón definitivamente. No sé por qué no revisé platform.search. En realidad, la búsqueda fue rescatar ... Excepción ... ¡Muchas gracias! – Pasta

1

Según the documentation:

Si la ejecución del bloque termina antes seg segundos ha pasado, vuelve verdadera. Si no, se termina la ejecución y eleva excepción (que por defecto es tiempo de espera :: Error)

Esto significa que sólo devuelve verdadero si es exitosa, de lo contrario no se establecerá la variable (es decir, es nula NO falsa)

En cuanto a su ejemplo va, sin duda es el tiempo de espera para mí y para llegar a la parte de rescate ...

4

El problema es que platform.search se está imponiendo la excepción de que Timeout#timeout throws.

Puede evitar esto al envolver su código interno en otro hilo - 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 vuelve a chupar ... – rogerdpack

+2

Hace poco describí y, posiblemente, resolvió este problema, aquí: http://code.jjb.cc/2012/09/15/sane_timeout-a-replacement-for-rubys- standard-library-timeout/ –

+0

Timeout es una mierda, pero este enfoque de Threaded funciona bien, gracias –

Cuestiones relacionadas