2009-12-06 14 views
11

इन दो स्निपेट पर विचार करें:पायथन में SyntaxError असंगतता?

try: 
    a+a=a 
except SyntaxError: 
    print "first exception caught" 

try: 
    eval("a+a=a") 
except SyntaxError: 
    print "second exception caught" 

दूसरे मामले में "दूसरा अपवाद .." कथन मुद्रित किया गया है (अपवाद पकड़ा गया), जबकि पहले में नहीं है।

पहला अपवाद है (इसे "SyntaxError1" कहें) किसी दूसरे से अलग ("SyntaxError2")?

क्या SyntaxError1 को पकड़ने का कोई तरीका है (इस प्रकार संकलन-समय त्रुटियों को दबा रहा है)? Xzx24 में कोड के बड़े ब्लॉक लपेटना असंतोषजनक है;)

+0

संकलन-समय त्रुटियों को दबाने ???? इसका क्या अर्थ हो सकता है? क्या आप उपयोग के मामले के लिए कुछ परिभाषा प्रदान कर सकते हैं जिसमें आप पार्स करने के लिए अयोग्य कोड चाहते हैं? क्या होने वाला है? कोड कितना खराब हो सकता है और फिर भी "पार्स" हो सकता है? तुम्हारी किस बारे में बोलने की इच्छा थी? –

+0

प्रश्न मुख्य रूप से अलग-अलग परिस्थितियों में फेंकने वाले सिंटेक्सएरर्स की संभावित असंगतता पर केंद्रित था। एलेक्स ने समझाया कि बिल्कुल कोई असंगतता नहीं है, और सभी वर्णित व्यवहार में कंपाइलर के तंत्र/तंत्र को छोड़कर उच्च स्तरीय संरचना बनाने के तंत्र शामिल हैं। अपलोड करने के ठीक बाद अपने वाक्यविन्यास को मान्य करने की आवश्यकता के साथ, एक संभावित डेवलपर * .py फ़ाइल द्वारा कुछ कार्यक्षमता (सरल प्लगइन सिस्टम?) के साथ एक संभावित उपयोग केस अपलोड हो सकता है। – gorsky

उत्तर

15

पहले मामले में, अपवाद संकलक, जो चल रहा है से पहले try/except संरचना भी मौजूद (यह है, क्योंकि संकलक ही है कि सेट हो जाएगा द्वारा उठाया जाता है पार्सिंग के बाद यह ठीक है)। दूसरे मामले में, कंपाइलर दो बार चल रहा है - और , के बाद संकलक के बाद संकलक के पहले भाग को संकलित करने के पहले ही try/except सेट अप करने के बाद अपवाद उठाया जा रहा है।

तो, वाक्यविन्यास त्रुटियों, एक तरह से या किसी अन्य को बीच में रोकने के लिए, आप संकलक दो बार चलाने के लिए व्यवस्था करने के लिए है - एक ही रास्ता eval है, स्पष्ट compile में निर्मित समारोह लेखन के बाद एक और कहता है, import काफी उपयोगी है (कोड को दूसरी फ़ाइल में), exec और execfile अन्य संभावनाएं अभी तक। लेकिन हालांकि आप इसे करते हैं, सिंटैक्स त्रुटियों को केवल try/except ब्लॉक की आवश्यकता के लिए पहली बार चलाने के बाद पकड़ा जा सकता है!

+0

मुझे विभिन्न प्रकार के समाधानों से अवगत नहीं था। विशेष रूप से स्पष्ट आयात के साथ एक मेरे छिपे हुए मामले को खूबसूरती से हल करता है। बहुत बहुत धन्यवाद, एलेक्स! – gorsky

2

लघु जवाब: नहीं

सिंटेक्स त्रुटियों हो सकता है जब कोड पार्स किया गया है, जो सामान्य अजगर कोड के लिए पहले कोड निष्पादित किया जाता है - कोड कोशिश अंदर क्रियान्वित नहीं किया गया है/ब्लॉक को छोड़कर के बाद से कोड नहीं है निष्पादन, अवधि।

हालांकि जब आप कुछ कोड eval या exec करते हैं, तो आप इसे रनटाइम पर पार्स कर रहे हैं, ताकि आप अपवाद को पकड़ सकें।

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