2011-10-04 18 views
7

में एक अपवाद के समय मेरे पास है कहते हैं:मैं बंधन पर पहुंच सकता है रूबी

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

rescue 
    puts $! 
    debugger 
end  

इस उदाहरण में, मैं a का मूल्य प्राप्त करना चाहते हैं। यदि abegin ब्लॉक में प्रारंभ किया गया है तो मैं बचाव करते समय इसे एक्सेस कर सकता हूं। हालांकि, इस उदाहरण में, a ब्लॉक-स्थानीय है। अपवाद के पल में बाध्यकारी पाने का कोई तरीका है, जब मैं बचाव करता हूं?

+0

मैं एक समाधान है कि माणिक में काम करता है, हालांकि मुझे याद है Rbx कुछ साफ 'Backtrace' वस्तुओं है कि आप के लिए उपयोगी हो सकता था के बारे में पता नहीं कर रहा हूँ। क्या आप शायद उस पर विस्तार कर सकते हैं जिसे आप प्राप्त करने की कोशिश कर रहे हैं? – riffraff

+0

@riffraff dunno अगर मैं इसे बेहतर समझा सकता हूं। मुझे एक (इस उदाहरण में) के मूल्य को पुनः प्राप्त करने की आवश्यकता है। वास्तविक दुनिया परिदृश्य के लिए, कल्पना करें कि 2. टाइम्स ब्लॉक एक पुनरावृत्ति ब्लॉक है, प्रत्येक बार एक CSV फ़ाइल से एक पंक्ति को पुनर्प्राप्त करना। किसी बिंदु पर, लाइन नंबर 203445 (सीएसवी फ़ाइल का) पर एक अपवाद होता है। अब, मैं उस पंक्ति संख्या पर जा सकता हूं। सीएसवी फ़ाइल में यह जांचने के लिए कि क्या वह विशेष पंक्ति "ठीक है" है। या मैं एक डीबगर सत्र को बचा सकता हूं और शुरू कर सकता हूं। इस समय। मुझे – Vassilis

+0

अपवाद के पल में बाइंडिंग देखने में सक्षम होना चाहिए, धन्यवाद, कारण मैं पूछ रहा था कि इसी तरह की स्थितियों में मेरे पास ब्लॉक ब्लॉक के अंदर त्रुटि प्रबंधन कोड था, इसलिए मुझे एकल मान को ठीक करने का मौका मिला और बस चलते रहें, जो आपके परिदृश्य में फिट होगा, हालांकि यह मूल प्रश्न का उत्तर नहीं देता है, मुझे डर है। एकमात्र चीज जो मैं सुझा सकता हूं वह यह है कि, यदि त्रुटि मूल कोड में नहीं है, तो आप कॉलर बाइंडिंग को स्टोर करने के लिए raise/विफल हो सकते हैं, लेकिन यह केवल आधा समाधान – riffraff

उत्तर

1

क्या आप , rescuedo ब्लॉक के अंदर ब्लॉक नहीं कर सकते हैं?

+0

है, मैं कर सकता हूं। ऐसा नहीं है कि मैं किसी के मूल्य की जांच करने में असमर्थ हूं, या जो भी अन्य मूल्य चाहता हूं। शायद मेरे प्रश्न का शीर्षक गलत है। अगर मैं इसे फिर से लिख सकता हूं, तो यह शुरू होगा जैसे "बाध्यकारी पहुंचना संभव है ..." या, बेहतर, "क्या रूबी मुझे अपवाद बिंदु पर बाध्यकारी प्रदान करता है?" – Vassilis

+1

मुझे यकीन है कि यह सबसे अच्छा जवाब है (यानी "नहीं")। :-) – sheldonh

0

ऐसा करने के लिए एक हैक संभव है। हालांकि यह बहुत अच्छा नहीं है:

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 

स्रोत: How can I get source and variable values in ruby tracebacks?

संबंधित मुद्दे