2009-09-23 10 views
18

Ecco un vero e proprio esempio veloce:Rubino Rescue Per Visualizzare Backtrace completa

puts File.join(nil, "hello") 

output sarebbe

test.rb:4:in 'join': can't convert nil into String (TypeError) 
from test.rb:4 

Ma quando faccio questo:

begin 
    puts File.join(nil, "hello") 
rescue => exception 
    puts exception.backtrace 
end 

Questa uscita volontà

test.rb:4:in 'join' 
test.rb:4 

Ora come faccio a catturare l'intero backtrace, inclusa la parte "non posso convertire nil in String (TypeError)"?

Vessels @Sarah: Nel mio codice specifico, questo frammento di codice:

puts "==============================" 
puts error.message 
puts "==============================" 
puts error.inspect 
puts "==============================" 
puts error.backtrace 
puts "==============================" 

restituisce

============================== 
exit 
============================== 
#<SystemExit: exit> 
============================== 
/usr/lib/ruby/1.8/glib2.rb:37:in `exit' 
/usr/lib/ruby/1.8/glib2.rb:37:in `exit_application' 
multi.rb:234:in `main' 
multi.rb:347 
============================== 
+0

In seguito alla modifica, sembra che il salvataggio stia rilevando un'eccezione SystemExit (sollevata quando si chiama exit) anziché l'errore TypeError dal tentativo di unirsi a nil con una stringa. Cosa c'è sulla riga multi.rb 234? – mikej

risposta

24

Il valore è memorizzato da qualche parte, in base a questa chiamata a #inspect:

irb(main):001:0> begin 
irb(main):002:1* puts File.join(nil, "Hello") 
irb(main):003:1> rescue => exception 
irb(main):004:1> puts exception.inspect 
irb(main):005:1> end 
#<TypeError: can't convert nil into String> 
=> nil 

Exception#message è la parte descrittiva:

irb(main):006:0> begin 
irb(main):007:1* puts File.join(nil, "hello") 
irb(main):008:1> rescue => ex 
irb(main):009:1> puts ex.message 
irb(main):010:1> end 
can't convert nil into String 
=> nil 

Quindi, per ottenere il tipo di dati che stai cercando, si potrebbe fare qualcosa di simile al seguente:

irb(main):015:0> begin 
irb(main):016:1* puts File.join(nil, "hey") 
irb(main):017:1> rescue => ex 
irb(main):018:1> puts "#{ex.backtrace}: #{ex.message} (#{ex.class})" 
irb(main):019:1> end 
(irb):16:in `join'(irb):16:in `irb_binding'C:/Ruby/lib/ruby/1.8/irb/workspace.rb 
:52:in `irb_binding':0: can't convert nil into String (TypeError) 
=> nil 
+0

Sì, ho provato questo =/Il codice che sto eseguendo è un loop principale di ruby-gnome, quindi quando cattura un errore, decide che l'errore è da Gtk.main, non dalla riga 234 in multi.rb. iniziare e salvare avvolge Gtk.main. – RyanScottLewis

2

@SaraVessels risposta è più vicino a ciò che si vuole ma pensavo che un'alternativa pronta all'uso potesse aiutare anche gli altri.

Per i scripties di noi, rubino è dotato di due variabili globali a portata di mano (o meglio, filo-global credo), e $![email protected] che indicano l'ultima eccezione e l'ultimo eccezioni backtrace.

begin 
    puts File.join(nil, "Hello") 
rescue 
    puts $! # ("no implicit ....") 
    puts [email protected] # backtrace 
end 

uscita volontà:

no implicit conversion of nil into String 
/tmp/e.rb:2:in `join' 
/tmp/e.rb:2:in `<main>' 

Questo non è molto esplicito, ma a portata di mano in ambienti interattivi o molto prototypish.

Rubino stdlib include il modulo 'English' (sì, maiuscolo), con la quale si potrebbe fare

require "English" # capital-E! 
# ... 
    puts $ERROR_INFO  # $! ("no implicit ....") 
    puts $ERROR_POSITION # [email protected] backtrace 
# ... 

E 'strano e non ho mai usato - ma forse qualcuno è Happ (y | ier) con quella.

Problemi correlati