2010-10-14 19 views
29

निम्न कोड पर विचार करें:पायथन में क्या बढ़ाता है?

try: 
    raise Exception("a") 
except: 
    try: 
     raise Exception("b") 
    finally: 
     raise 

यह Exception: a बढ़ाएगा। मुझे उम्मीद है कि यह Exception: b को बढ़ाने के लिए (मुझे समझाने की ज़रूरत क्यों है?)। अंतिम raise ने आखिरी अपवाद उठाए जाने के बजाए मूल अपवाद क्यों उठाया (जो मैंने सोचा था)?

+7

अजगर 3.1 दोनों को जन्म देती है उठाना पड़ता ब्लॉक की जगह। – kennytm

+1

आह। मुझे उल्लेख करना चाहिए था कि मैं पायथन 2.6 पर हूं। – wilhelmtell

+1

जिज्ञासा से बाहर: एक ही संयोजन पर सी # कंपाइलर कहता है "त्रुटि: निकटतम संलग्न क्लॉज क्लॉज के अंदर घोंसला वाले अंत में एक तर्क के साथ एक फेंक स्टेटमेंट की अनुमति नहीं है" (फेंक == raise, पकड़ == को छोड़कर)। कोई अस्पष्टता नहीं! – Andrey

उत्तर

15

python2.6

मुझे लगता है पर, आप अंत में "कोशिश" ब्लॉक जहां अपवाद 'बी' को बढ़ाने के साथ संबद्ध किया जा सके ब्लॉक उम्मीद कर रहे हैं। आखिरकार ब्लॉक पहले "कोशिश" ब्लॉक से जुड़ा हुआ है।

आप भीतरी कोशिश ब्लॉक में ब्लॉक को छोड़कर एक अतिरिक्त है, तो अंत में ब्लॉक अपवाद बी बढ़ा देंगे

try: 
    raise Exception("a") 
except: 
    try: 
    raise Exception("b") 
    except: 
    pass 
    finally: 
    raise 

आउटपुट:

Traceback (most recent call last): 
    File "test.py", line 5, in <module> 
    raise Exception("b") 
Exception: b 

एक और भिन्नता है कि यहाँ क्या हो रहा

क्या बताते हैं
try: 
    raise Exception("a") 
except: 
    try: 
    raise Exception("b") 
    except: 
    raise 

आउटपुट:

Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    raise Exception("b") 
Exception: b 

आप यहाँ देख रहे हैं, तो अंत में साथ छोड़कर अपवाद बी

+0

से नहीं पूछा था, मैं एक ही निष्कर्ष पर आया हूं। –

+0

दरअसल, यह काम करता है! मैंने कभी अनुमान लगाया नहीं होगा। क्या यह कहीं दस्तावेज है? क्या यह एक विशेषता है या यह एक आवश्यकता है जो व्याकरण में मुद्दों से आता है? – wilhelmtell

+0

दूसरा अपवाद केवल पहले छाया क्यों नहीं करता है? मेरी इच्छा है कि पाइथन सिंटैक्स के लिए गलती करेगी, या कम से कम मुझे इसके बारे में चेतावनी दें। – wilhelmtell

26

Raise is re-raising the last exception you caught, not the last exception you raised

(स्पष्टता के लिए टिप्पणियों से फिर से पोस्ट किया)

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