2012-06-22 12 views
53

के साथ अजीब कोशिश-छोड़ने-अंत-व्यवहार व्यवहार यह कुछ कोड है जो असाधारण व्यवहार कर रहा है। यह मैंने जो व्यवहार लिखा है उसका सरलीकृत संस्करण है। यह अभी भी अजीब व्यवहार का प्रदर्शन करेगा और मेरे पास कुछ विशिष्ट प्रश्न थे कि यह क्यों हो रहा है।रिटर्न स्टेटमेंट्स

मैं जब आप इस स्क्रिप्ट को चलाने अजगर 2.6.6 का उपयोग कर रहा है Windows 7.

def demo1(): 
    try: 
     raise RuntimeError,"To Force Issue" 
    except: 
     return 1 
    else: 
     return 2 
    finally: 
     return 3 

def demo2(): 
    try: 
     try: 
      raise RuntimeError,"To Force Issue" 
     except: 
      return 1 
     else: 
      return 2 
     finally: 
      return 3 
    except: 
     print 4 
    else: 
     print 5 
    finally: 
     print 6 

if __name__ == "__main__": 
    print "*** DEMO ONE ***" 
    print demo1() 
    print "****************" 
    print 
    print "*** DEMO TWO ***" 
    print demo2() 
    print "****************" 

पर, यह प्रिंट होगा:

*** DEMO ONE *** 
3 
**************** 

*** DEMO TWO *** 
6 
3 
**************** 

डेमो एक क्यों लौटा रहा है 3 के बजाय 1? 6 डब्ल्यू/4 या 5 प्रिंट करने के बजाय डेमो दो प्रिंटिंग 6 क्यों है?

आपकी मदद के लिए धन्यवाद।

उत्तर

80

क्योंकि finally कथन को निष्पादित करने के लिए गारंटीकृत है (अच्छी तरह से, कोई पावर आउटेज या पायथन के नियंत्रण के बाहर कुछ भी नहीं मानते)। इसका मतलब है कि फ़ंक्शन वापस आने से पहले, इसे अंत में ब्लॉक करना होगा, जो एक अलग मान देता है।

Python docs राज्य:

जब एक वापसी, तोड़ने या बयान जारी रखने के लिए एक कोशिश ... अंत में बयान की कोशिश कमरे में निष्पादित किया जाता है, अंत में खंड भी निष्पादित किया जाता है 'जिस तरह से बाहर पर।' अंत में खंड में जारी बयान अवैध है। (कारण वर्तमान कार्यान्वयन के साथ एक समस्या है - भविष्य में यह प्रतिबंध हटाया जा सकता है)।

इसका मतलब यह है कि जब आप वापस जाने के लिए प्रयास करते हैं, finally ब्लॉक कहा जाता है, लौटने यह मूल्य है, बल्कि एक है कि आप पड़ता था की तुलना में।

+1

दूसरे उदाहरण में 5 प्रिंट क्यों नहीं है? यह अभी भी अच्छी तरह से समझाया नहीं है मुझे लगता है। रिटर्न एक का उत्तर दिया जाता है लेकिन दूसरे उदाहरण में 5 क्यों नहीं –

+4

प्रिंट करता है ओह मुझे लगता है कि मैंने इसे शुरुआती प्रयास में वापसी के बारे में बताया है, यह तुरंत अंततः बाहरी –

+2

पर कूदने का कारण बनता है, क्योंकि 'आखिरकार' ब्लॉक ** हमेशा ** रन –

1

निष्पादन आदेश है:

  1. कोशिश ब्लॉक सब सामान्य रूप से पूरा करता है -> अंत में ब्लॉक -> समारोह
  2. कोशिश ब्लॉक रन समाप्त हो जाती है और अपवाद एक में मिल -> अंत में ब्लॉक -> समारोह समाप्त
  3. ब्लॉक को रिटर्न वैल्यू और कॉल रिटर्न बनाने का प्रयास करें -> आखिरकार ब्लॉक -> पॉपअप रिटर्न वैल्यू -> फ़ंक्शन समाप्त होता है

तो, अंत में ब्लॉक में कोई भी वापसी अग्रिम चरणों को समाप्त कर देगी।

+0

आप अपने उत्तर के लिए एक सूची प्रारूप का उपयोग कर सकते हैं। – gsamaras

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