2011-10-04 21 views
7

bir istisna sırasında zorlayıcı erişebilir miyim ben olduğunu varsayalım: Bu örnekteBen Ruby

begin 
    2.times do 
    a = 1 
    1/0 
    end 

rescue 
    puts $! 
    debugger 
end  

, ben a değerini almak istiyorum. abegin bloğunda başlatılmışsa, kurtardığımda erişebilirim. Ancak, bu örnekte, a blok yereldir. Kurtardığımda, istisna anında bağlayıcılık almanın bir yolu var mı?

+0

ben rbx sizin için yararlı olabilir bazı temiz 'Backtrace' nesneleri vardı hatırlamak olsa yakutlar genelinde çalışan bir çözümün farkında değilim. Neyi başarmaya çalıştığınıza göre genişletebilir misiniz? – riffraff

+0

@riffraff dunno daha iyi açıklayabilirim. Bu değerin (bu örnekte) değerini almam gerekiyor. Gerçek bir dünya senaryosu için, 2x bloğunun her seferinde bir CSV dosyasından bir satır alınıp yinelenen bir blok olduğunu hayal edin. Bir noktada, 203445 numaralı satırda (CSV dosyasının) bir istisna gerçekleşir. Şimdi o numaraya gidebilirim. Belirli bir çizginin "Tamam" olup olmadığını kontrol etmek için CSV dosyasında. Ya da bir hata ayıklayıcı oturumu başlatabilir ve başlatabilirim. Bu noktada. İstisna anındaki – Vassilis

+0

numaralı bağlantı sayesinde bağlanmayı görmem gerekiyor, çünkü sormamın sebebi de benzer durumlarda hata yönetim kodunun do bloğun içinde olmasıydı, bu yüzden tek değeri düzeltme şansım oldu. ve sadece devam et, hangi senaryoya uyuyor gibi görünen, orijinal soruya cevap vermese de, korkarım. Önem verebileceğim tek şey, eğer hata yerel kodda değilse, arayan bağlayıcıyı saklamak için yükseltme/artırma işlemini geçersiz kılabilir, ancak bu sadece bir çözüm olan – riffraff

cevap

1

do bloğunun içine başka bir begin, rescue bloğu yerleştiremez misiniz?

+0

olabilir. Bu, ya da istediğim başka bir değerin değerini kontrol edemem. Belki sorumun başlığı yanlış. Yeniden yazabilirsem, "Bağlanmaya erişmek mümkün mü ..." veya daha iyisi, "Ruby bana istisna noktasında bağlayıcılık sağlıyor mu?" – Vassilis

+1

Eminim ki bu en iyi cevaptır (örn. "Hayır"). :-) – sheldonh

0

Bunu yapmak mümkün bir kesmek gibi görünüyor. Ama çok güzel değil:

class Foo < Exception 
    attr_reader :call_binding 

    def initialize 
    # Find the calling location 
    expected_file, expected_line = caller(1).first.split(':')[0,2] 
    expected_line = expected_line.to_i 
    return_count = 5 # If we see more than 5 returns, stop tracing 

    # Start tracing until we see our caller. 
    set_trace_func(proc do |event, file, line, id, binding, kls| 
     if file == expected_file && line == expected_line 
     # Found it: Save the binding and stop tracing 
     @call_binding = binding 
     set_trace_func(nil) 
     end 

     if event == :return 
     # Seen too many returns, give up. :-(
     set_trace_func(nil) if (return_count -= 1) <= 0 
     end 
    end) 
    end 
end 

class Hello 
    def a 
    x = 10 
    y = 20 
    raise Foo 
    end 
end 
class World 
    def b 
    Hello.new.a 
    end 
end 

begin World.new.b 
rescue Foo => e 
    b = e.call_binding 
    puts eval("local_variables.collect {|l| [l, eval(l)]}", b).inspect 
end 

Kaynak: How can I get source and variable values in ruby tracebacks?