2013-08-17 9 views
5

Sto provando a codificare un client a due thread usando ruby, un thread legge i dati da un socket e lo stampa, l'altro thread legge i dati locali e li invia a Server remoto. Il problema che ho trovato è che sembra come Ruby non può catturare gli errori all'interno di un filo, ecco un esempio:Come rendere Ruby catturato l'errore di sintassi nei thread

#! /usr/bin/ruby 

Thread.new { 
    loop { 
    $stdout.puts "hi" 
    abc.puts ef 
    sleep 1 
    } 
} 


loop { 
    sleep 1 
} 

Ovviamente, al di fuori del filo se digito abc.puts ef il codice non verrà mai eseguito dal rubino riporterà "variabile non definita abc". Tuttavia, se si trova all'interno di una discussione, non vi è alcun rapporto di errore. La mia domanda è, come permettere a Ruby di catturare errori come questo? O almeno, segnalare che qualcosa non va in una discussione?

+0

'SyntaxError' non viene generato, ma' NameError'. – falsetru

risposta

6

Uso Thread::abort_on_exception=:

Secondo Thread - Exception Handling:

Qualunque thread può sollevare un'eccezione utilizzando il metodo di istanza raise, , che funziona in modo simile a Ke RNEL # rilancio.

Tuttavia, è importante notare che un'eccezione che si verifica in qualsiasi thread eccetto il thread principale dipende da abort_on_exception. L'opzione è falsa per impostazione predefinita, ovvero qualsiasi eccezione non gestita comporterà perché il thread si interrompa automaticamente quando viene atteso da entrambi i join o dal valore. Puoi modificare questo valore predefinito abort_on_exception = true o impostando $ DEBUG su true.

...

Thread::abort_on_exception = true 
Thread.new { 
    loop { 
    $stdout.puts "hi" 
    abc.puts ef 
    sleep 1 
    } 
} 


loop { 
    sleep 1 
} 

=>

hi 
t.rb:5:in `block (2 levels) in <main>': undefined local variable or method `abc' for main:Object (NameError) 
     from t.rb:3:in `loop' 
     from t.rb:3:in `block in <main>' 
0

Ok, una soluzione possibile è circondare il lambda filo con beginrescueend blocco:

Thread.new { 
begin 
    abc.puts ef 
rescue 
    puts error 
end 
}