2011-01-09 15 views
9

ho questo pezzo di codice:Rubino Timeout :: timeout non fa eccezione il fuoco e non restituisce quanto documentato

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

Ho poi lanciare il metodo che contiene questo codice, e bene, qui è l'inizio di una traccia dello stack:

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

Così ho pensa ingenuamente che la mia chiamata timeouted. Ma "Stampa qualcosa per piacere" non viene mai stampato e lo complete_results che si suppone sia il valore di ritorno dello stato di timeout (sia vero che falso, come menzionato nella documentazione), non è definitivamente un valore booleano.

Sto facendo qualcosa di sbagliato?

risposta

19

Il codice è corretto

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

non stampare "mi stampare qualcosa per favore".

Provare il codice di base come sopra. Se funziona, hai un problema in platform.search.

+0

Hai avuto ragione. Non so perché non ho controllato platform.search. In realtà, la ricerca è stata di soccorso .. Eccezione ... Grazie mille! – Pasta

1

Secondo the documentation:

Se l'esecuzione del blocco termina prima sec secondi è passato, restituisce vero. In caso contrario, termina l'esecuzione e solleva un'eccezione (che di default è Timeout :: Error)

Questo significa che restituisce true solo se è successo, altrimenti non verrà impostata la variabile (cioè è pari a zero non è falso).

Per quanto riguarda il tuo esempio va, è sicuramente tempismo per me e raggiungere la parte soccorso ...

4

Il problema è che platform.search sta recuperando l'eccezione che Timeout#timeout throws.

È possibile aggirare questo avvolgendo il codice interno in un altro 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 fa nuovamente schifo ... – rogerdpack

+2

Ho recentemente descritto e, possibilmente, risolto questo problema, qui: http://code.jjb.cc/2012/09/15/sane_timeout-a-replacement-for-rubys- timeout della libreria standard/ –

+0

Timeout fa schifo, ma questo approccio con thread funziona bene, grazie –

Problemi correlati