2009-02-07 7 views
12

In questo momento sto riscontrando un problema in cui non riesco a vedere dove i thread dei miei figli stiano sputando messaggi di errore che rendono difficile il debug.Come ottenere messaggi di errore da thread ruby ​​

esempio:

Thread.new{ 
    a = 1/0 
} 

Esiste un modo per avere tutti gli errori filo stampano fuori a stderr?

risposta

16

Impostare la classe Thread 'abort_on_exception flag su true.

In alternativa, avvolgere il corpo del filo in un blocco di lancio/fermo e scaricare l'eccezione nel fermo.

6

Ciò dovrebbe rilevare eventuali errori non gestiti in modo esplicito e stamparli su STDOUT.

require 'pp' 

Thread.new { 
    begin 
    a = 1/0 
    rescue 
    pp $! 
    end 
} 

risultato: #<ZeroDivisionError: divided by 0>

8

Impostare $DEBUG a true (è possibile farlo da riga di comando con -d), e avrete

ruby -d bad_thread.rb 
Exception `LoadError' at /usr/lib/ruby/site_ruby/1.8/rubygems.rb:1113 - no such file to load -- rubygems/defaults/operating_system 
Exception `LoadError' at /usr/lib/ruby/site_ruby/1.8/rubygems/config_file.rb:34 - no such file to load -- Win32API 
Exception `ZeroDivisionError' at bad_thread.rb:2 - divided by 0 
bad_thread.rb:2:in `/': divided by 0 (ZeroDivisionError) 
    from bad_thread.rb:2 
    from bad_thread.rb:1:in `initialize' 
    from bad_thread.rb:1:in `new' 
    from bad_thread.rb:1 
+1

Grazie! Questo ha appena aumentato la mia velocità di debug su un fastidioso server DRb di un ordine di grandezza. – Phrogz