2009-12-11 13 views
8

मैं एक उपकरण बना रहा हूं जहां अपवाद ऊपर की ओर फैलता है, अपवाद के संदर्भ के बारे में नया डेटा अपवाद में जोड़ा जाता है। मुद्दा यह है कि जब तक अपवाद शीर्ष स्तर तक पहुंच जाता है, तब तक सभी अतिरिक्त संदर्भ डेटा मौजूद होते हैं, लेकिन केवल नवीनतम स्टैक ट्रेस दिखाया जाता है। क्या अपवाद रखने का कोई आसान तरीका मूल स्टैक ट्रेस दिखाता है जिसमें इसे अंतिम स्टैक ट्रेस के बजाए फेंक दिया गया था, या क्या मुझे पहली बार मूल स्टैक ट्रेस को अपनाना है जैसे अपवाद प्रसारित करता है?पायथन अपवाद प्रचार

उदाहरण के लिए, निम्न कोड:

def a(): 
    return UNBOUND 
def b(): 
    try: 
     a() 
    except Exception as e: 
     raise e 
b() 

पैदावार निम्नलिखित अपवाद:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    b() 
    File "test.py", line 7, in b 
    raise e 
NameError: global name 'UNBOUND' is not defined 

जहां, आदर्श, मैं चाहता हूँ किसी भी तरह उपयोगकर्ता को दिखाने के लिए इस:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    File "test.py", line 2, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

चूंकि उपयोगकर्ता उस रेखा को इंगित करता है जिस पर मूल रूप से त्रुटि हुई थी।

उत्तर

26

पायथन अपवाद जावा की तरह थोड़ा हैं, अपवाद को बिना छेड़छाड़ किए अपवाद को पुनर्स्थापित करने का एक तरीका है।

तर्क के बिना बस raise का उपयोग करें। परिणाम यह:

Traceback (most recent call last): 
    File "./exc.py", line 11, in <module> 
    b() 
    File "./exc.py", line 7, in b 
    a() 
    File "./exc.py", line 4, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

आप e वस्तु के बारे में कुछ बातें संशोधित कर सकते हैं, भले ही आप अभी raise कि तर्क के बिना - उदाहरण के लिए:

e.args = ("hi!",) 
raise 

वास्तव में अपवाद संदेश बदल जाएगा। ढेर को नष्ट किए बिना आप शायद अन्य विकल्पों को भी इस तरह बदल सकते हैं।

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