2011-03-16 6 views
10

क्या संदर्भ से वैरिएबल स्कोप मुद्रित करने का कोई तरीका है जहां अपवाद होता है?पाइथन के लिए संदर्भ से वैरिएबल स्कोप मुद्रित करने का कोई तरीका है जहां अपवाद होता है?

def f(): 
    a = 1 
    b = 2 
    1/0 

try: 
    f() 
except: 
    pass # here I want to print something like "{'a': 1, 'b': 2}" 
+0

क्या "चर गुंजाइश मुद्रित करने के लिए" क्या मतलब है? क्या आप एक उदाहरण दे सकते हैं? –

+1

यही है कि 'छोड़कर' खंड के लिए है। उदाहरण के लिए कृपया कुछ कोड प्रदान करें कि आप 'को छोड़कर' खंड में चीजें क्यों प्रिंट नहीं कर रहे हैं। –

+0

मेरा मतलब अपवाद के दायरे में सभी चर प्रिंट करना है। – Soid

उत्तर

14

आप पिछले अपवाद है कि खंड को छोड़कर आप में मौजूदा धागा में हुई पाने के लिए समारोह sys.exc_info() उपयोग कर सकते हैं। यह अपवाद प्रकार, अपवाद उदाहरण और ट्रेसबैक का एक गुच्छा होगा। ट्रेसबैक फ्रेम की एक लिंक्ड सूची है। दुभाषिया द्वारा बैकट्रैक मुद्रित करने के लिए इसका उपयोग किया जाता है। इसमें स्थानीय डिक्शनरी शामिल है।

तो तुम कर सकते हैं:

import sys 

def f(): 
    a = 1 
    b = 2 
    1/0 

try: 
    f() 
except: 
    exc_type, exc_value, tb = sys.exc_info() 
    if tb is not None: 
     prev = tb 
     curr = tb.tb_next 
     while curr is not None: 
      prev = curr 
      curr = curr.tb_next 
     print prev.tb_frame.f_locals 
3

शायद आप locals() और globals() लिए देख रहे हैं:

उदाहरण के लिए

?

+0

में एक उदाहरण जोड़ा है मैंने इसे अपने प्रश्न से पहले देखा लेकिन यह अपवाद के संदर्भ चर नहीं प्राप्त कर सकता है। मुझे नहीं पता कि ऊपर उदाहरण में इसका उपयोग कैसे किया जाए। – Soid

+0

हां, आप सही हैं। अपने उदाहरण कोड में, आप इन कार्यों का उपयोग करके फ़ंक्शन 'f' का संदर्भ प्राप्त नहीं कर पाएंगे। –

7

आप अपने उदाहरण कुछ में पहली निकालने ट्रैस बैक करने के लिए है, इस तरह इसे प्रिंट होगा:

except: 
    print sys.exc_traceback.tb_next.tb_frame.f_locals 

मैं tb_next बारे में निश्चित नहीं हूँ, मैं, आप पूरा ट्रैस बैक के माध्यम से जाने के लिए है लगता है कि होगा तो इस (untested) की तरह कुछ:

except: 
    tb_last = sys.exc_traceback 
    while tb_last.tb_next: 
     tb_last = tb_last.tb_next 
    print tb_last.tb_frame.f_locals 
संबंधित मुद्दे