2010-01-21 14 views
11

को छोड़कर होता है मेरे पास पाइथन except खंड में कुछ कोड है जो कुछ लॉगिंग करने का इरादा है, लेकिन लॉगिंग कोड स्वयं अपवाद का कारण बन सकता है। मेरे मामले में, मैं किसी भी दूसरे अपवाद को अनदेखा करना चाहता हूं जो हो सकता है, और मूल अपवाद बढ़ा सकता है। यहाँ एक बहुत ही सरल बनाया उदाहरण है:एक पायथन अपवाद को संभालने के लिए जो कि

try: 
    a = this_variable_doesnt_exist 
except: 
    try: 
     1/0 
    except: 
     pass 
    raise 

ऊपर कोड चल रहा है, मैं प्राप्त करने के लिए आशा है कि:

NameError: name 'this_variable_doesnt_exist' is not defined 

लेकिन इसके बजाय, पायथन 2.x में, मैं मिलता है:

ZeroDivisionError: integer division or modulo by zero 

मैंने पाया है कि पायथन 3.x में, यह वही करता है जो मैं चाहता हूं।

मुझे पाइथन 2.x दस्तावेज़ों में इस पर अधिक टिप्पणी नहीं मिली (जब तक कि मैं इसे याद नहीं करता)। क्या मैं इसे 2.x में प्राप्त कर सकता हूं?

उत्तर

15

अमूर्त के साथ:

def log_it(): 
    try: 
     1/0 
    except: 
     pass 

try: 
    this = that 
except: 
    log_it() 
    raise 

क्या आप अजगर 2.5

यह एक चर में अपवाद स्टोर करने के लिए है करने के लिए एक और तरीका है में चाहता है, तो यह स्पष्ट रूप से फिर से बढ़ा:

try: 
    this = that 
except NameError, e: # or NameError as e for Python 2.6 
    try: 
     1/0 
    except: 
     pass 
    raise e 

ध्यान दें कि आपको शायद कुछ भी पकड़ने के लिए नंगे except का उपयोग नहीं करना चाहिए - आमतौर पर उन विशिष्ट अपवादों को पकड़ना सर्वोत्तम होता है जिन्हें आप उम्मीद करते हैं o एक कठोर और घातक अपवाद (जैसे स्मृति से बाहर होने) में होता है।

18

मुझे विश्वास है कि आप जो देख रहे हैं वह exception chaining का परिणाम है, जो change in Python 3 है।

पीईपी की प्रेरणा अनुभाग से:

एक अपवाद (अपवाद A) की हैंडलिंग के दौरान, यह संभव है कि एक और अपवाद (अपवाद B) हो सकती है। आज के पायथन (संस्करण 2.4) में, यदि ऐसा होता है, तो अपवाद B प्रचारित है और अपवाद A खो गया है। समस्या को डीबग करने के लिए, दोनों अपवादों के बारे में जानना उपयोगी है। __context__ विशेषता स्वचालित रूप से इस जानकारी को बरकरार रखती है।

पीईपी तो नया अपवाद श्रृंखलन विस्तार — में (जो Py3k में कार्यान्वित किया जाता) यह एक दिलचस्प पढ़ा है वर्णन करने के लिए चला जाता है। मैंने आज कुछ नया सीखा।

+0

किसी को माध्यमिक अपवाद को स्पष्ट रूप से कैसे संभालना चाहिए? कृपया इसे अपने उत्तर –

0

मेरे CausedException class में मैं पाइथन 2.x (और पाइथन 3 के लिए भी इसका ख्याल रखता हूं, यदि आप साधारण कारण श्रृंखलाओं के बजाय पेड़ का कारण बनना चाहते हैं)। शायद यह आपकी मदद कर सकता है।

+1

में शामिल करें, जबकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (http://meta.stackexchange.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और लिंक प्रदान करें सन्दर्भ के लिए। –

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