2017-12-12 83 views
5

मैं एक शब्दकोश के अंदर अपवादों का ट्रैक रखना चाहता हूं और इसे वापस कराना चाहता हूं। हालांकि जब मैं ऐसा करता हूं, अंत में ब्लॉक मुझे खाली शब्दकोश देता है। तर्क स्केलरों के लिए काफी काम करता है। क्या कोई व्यक्ति व्यवहार को समझा सकता है।अंत में वापसी क्यों अंततः खाली शब्दकोश देता है?

अदिश संदर्भ में:

def test(): 
    temp = 1 
    try: 
     raise ValueError("sdfs") 
    except: 
     temp = 2 
    finally: 
     temp = temp + 3 
     return temp 
test() 
5 
शब्दकोश के साथ

:

def test(): 
    temp = dict() 
    try: 
     raise ValueError("something") 
    except Exception as error: 
     print("error is :{}".format(error)) 
     temp['except'] = "something" + error 
    finally: 
     return temp 

test() 
error is : something 
{} 
+0

कहाँ कोड है कि अंतिम परिणाम प्रिंट –

+0

नोट है? पाइथन में 'स्केलर संदर्भ' अवधारणा नहीं है। आप वहां पर्ल के बारे में सोच रहे हैं, शायद –

+0

हाँ ... आपको संदर्भ मिला हालांकि :) – saz01

उत्तर

6

आप एक finally हैंडलर क्योंकि वहाँ अपवाद संचालक, जो निगल लिया है उठाया जा करने के लिए एक अपवाद के कारण होता है कि रिटर्न से फ़ंक्शन

आप केवल अपवाद ऑब्जेक्ट और स्ट्रिंग को संयोजित नहीं कर सकते हैं, इसलिए अतिरिक्त TypeError उठाया गया है, और शब्दकोश को असाइनमेंट कभी नहीं पहुंचा है।

एक स्ट्रिंग के लिए अपवाद परिवर्तित पहले काम करता है:

>>> def test(): 
...  temp = dict() 
...  try: 
...   raise ValueError("something") 
...  except Exception as error: 
...   print("error is :{}".format(error)) 
...   temp['except'] = "something" + str(error) 
...  finally: 
...   return temp 
... 
>>> test() 
error is :something 
{'except': 'somethingsomething'} 

try statement documentation से:

finally तो मौजूद है, यह एक 'सफाई' हैंडलर निर्दिष्ट करता है। try खंड निष्पादित किया गया है, जिसमें except और else क्लॉज शामिल हैं। यदि किसी भी खंड में कोई अपवाद होता है और इसे नियंत्रित नहीं किया जाता है, तो अपवाद अस्थायी रूप से सहेजा जाता है। finally खंड निष्पादित किया गया है। यदि कोई सहेजा गया अपवाद है तो इसे finally खंड के अंत में फिर से उठाया गया है। यदि finally खंड एक और अपवाद उठाता है, तो सहेजा गया अपवाद नए अपवाद के संदर्भ के रूप में सेट किया गया है। finally खंड एक return या break बयान निष्पादित करता है, तो बचा लिया अपवाद त्याग दिया जाता है [।]

(बोल्ड जोर मेरा)।

+0

पर स्पॉट ... बहुत बहुत धन्यवाद !! – saz01

4

लाइन "something" + error एक त्रुटि को उठाती है जिसे हटा दिया गया है क्योंकि आप finally से लौट आए हैं। त्रुटि के कारण temp को असाइनमेंट कभी भी ऐसा नहीं किया जाता है कि कुछ भी नहीं होता है।

यह try-except के लिए the documentation में कहा गया है:

तो अंत में मौजूद है, यह एक 'सफाई' हैंडलर निर्दिष्ट करता है। try खंड निष्पादित किया गया है, जिसमें किसी भी को छोड़कर और अन्य खंड शामिल हैं। यदि किसी भी खंड में अपवाद होता है और इसे नियंत्रित नहीं किया जाता है, तो अपवाद अस्थायी रूप से सहेजा गया है। आखिरकार खंड निष्पादित किया गया है। यदि एक सहेजा गया अपवाद है तो अंततः खंड के अंत में इसे फिर से उठाया गया है। यदि अंत में खंड एक और अपवाद उठाता है, तो सहेजा गया अपवाद नए अपवाद के संदर्भ के रूप में सेट किया गया है। यदि अंत में खंड वापसी या ब्रेक स्टेटमेंट निष्पादित करता है, तो सहेजा गया अपवाद छोड़ दिया जाता है।

(जोर मेरा)

एक त्रुटि के बिना

(यानी temp['except'] = error आप अपेक्षित व्यवहार मिलता है:

>>> test() 
error is :something 
{'except': ValueError('something')} 
संबंधित मुद्दे