2009-09-23 11 views
18

İşte gerçek kısa bir örnek:Yakut Kurtarma Tam BackTrace Görüntülemek İçin

puts File.join(nil, "hello") 

misiniz çıkış

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

Ama bunu yaparken:

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

çıktısı verir

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

Simdi "nil'i String (TypeError) 'a çeviremez" bölümü de dahil olmak üzere tam backtrace'i nasıl yakalarım?

@Sarah Gemiler: Benim spesifik kodunda , bu pasajı: Değer oralarda saklanır

============================== 
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

görünüyor. Multi.rb satırında ne var 234? – mikej

cevap

24

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

döner #inspect için bu çağrı dayalı:

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 açıklayıcı bir parçasıdır:

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 

Böylece gibi bir şey yapabileceğini, aradığınız veri türünü almak için aşağıdaki:

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

Evet, bu denedim =/ben koşuyorum kodu bir yakut-gnome ana döngü böyledir bu bir hata yakalar, bunun hata değil multi.rb hat 234 den, Gtk.main dan karar verir. Gtk.main etrafında başlar ve kurtarma sarar. – RyanScottLewis

2

@SaraVessels cevap istediğini daha yakın ama hazır bir alternatifin başkalarına da yardımcı olabileceğini düşündüm. Bize scripties için

, yakut iki kullanışlı globaller ile gelir (iyi, parçacığı küresel Sanırım), $! ve [email protected] son İstisna ve son İstisnalar backtrace hangi nokta.

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

çıktısı:

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

Bu etkileşimli ya da çok prototypish ortamlarda çok açık, ama kullanışlı değil.

Yakut stdlib Eğer

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

Onun tuhaf yapabileceği hangi 'English' modül (evet, büyük harf) içerir ve asla kullanılmış - ama belki biri happ (y | ier) bununla. Kurtarma (eğer exit çağırdığınızda kaldırdı) bir SystemExit istisna yerine bir dize ile nil katılmaya çalışan den TypeError yakalıyor gibi düzenlemenizin ardından