2015-12-05 17 views
7

मैं python documentation पढ़ रहा हूं, क्या कोई इसे समझने में मेरी मदद कर सकता है?कथन वाक्यविन्यास का प्रयास करें

try_stmt ::= try1_stmt | try2_stmt 
try1_stmt ::= "try" ":" suite 
       ("except" [expression [("as" | ",") identifier]] ":" suite)+ 
       ["else" ":" suite] 
       ["finally" ":" suite] 
try2_stmt ::= "try" ":" suite 
       "finally" ":" suite 

मैं शुरू में सोचा था कि यह मतलब है कि कोशिश बयान या तो प्रारूपों

  1. try और finally या
  2. try, except, else और finally पड़ा।

लेकिन प्रलेखन पढ़ने के बाद, यह उल्लेख किया गया कि else वैकल्पिक है और इसलिए finally है। तो, मैं सोच रहा था कि दस्तावेज का उद्देश्य क्या है जो हमें उपर्युक्त प्रारूप में कोड दिखा रहा है?

+2

ब्रैकेट का मतलब वैकल्पिक है। 'को छोड़कर 'पर अभिभावकों का उपयोग' + 'के साथ समूहबद्ध करने के लिए किया जाता है (क्योंकि' छोड़कर 'उस रूप में एक से अधिक बार हो सकता है)। – ShadowRanger

उत्तर

4

आप try कथन के दो रूप हैं। उनके बीच मुख्य अंतर यह है कि try1_stmt के मामले में except खंड निर्दिष्ट होना चाहिए

Introduction | Notation अजगर भाषा संदर्भ के में, निम्न लिखा है:

एक सितारा (*) शून्य या अधिक repetitions के पूर्ववर्ती आइटम के का मतलब है, इसी तरह, एक प्लस (+) एक या अधिक repetitions का मतलब है, और एक वाक्यांश वर्गाकार कोष्ठक में ([]) शून्य का मतलब है या एक घटनाओं (दूसरे शब्दों में, संलग्न वाक्यांश वैकल्पिक है)। * और + ऑपरेटर यथासंभव कसकर बांधते हैं; ब्रांड्स का उपयोग समूह के लिए किया जाता है।

तो, विशेष रूप से, पहले के रूप में:

try1_stmt ::= "try" ":" suite 
       ("except" [expression [("as" | ",") identifier]] ":" suite)+ 
       ["else" ":" suite] 
       ["finally" ":" suite] 

else और finally खंड वैकल्पिक ([]), आप केवल एक try बयान और एक या अधिक (+)except खंड की आवश्यकता होती है ।

दूसरा रूप में:

try2_stmt ::= "try" ":" suite 
       "finally" ":" suite 

आप केवल एक भी try और कोई except खंड के साथ एक एकल finally खंड की है।


ध्यान दें कि पहले मामले के लिए दूसरे के आदेश और आखिरकार खंड तय किए गए हैं।else क्लॉज finally क्लॉज परिणाम SyntaxError में परिणाम।

दिन के अंत में, यह सब अनिवार्य रूप से नहीं केवल एक else खंड के साथ मिलकर एक try खंड है करने में सक्षम होने के लिए निर्भर करता है। तो कोड के रूप में इन दोनों की अनुमति है:

कोशिश बयान (try1_stmt) सबसे पहले प्रपत्र:

try: 
    x = 1/0 
except ZeroDivisionError: 
    print("I'm mandatory in this form of try") 
    print("Handling ZeroDivisionError") 
except NameError: 
    print("I'm optional") 
    print("Handling NameError") 
else: 
    print("I'm optional") 
    print("I execute if no exception occured") 
finally: 
    print("I'm optional") 
    print("I always execute no matter what") 

दूसरा फार्म (try2_stmt):

try: 
    x = 1/0 
finally: 
    print("I'm mandatory in this form of try") 
    print("I always execute no matter what") 

एक आसान के लिए इस विषय पर पीईपी पढ़ने के लिए, PEP 341 देखें जिसमें दो रूपों के लिए मूल प्रस्ताव शामिल है try कथन का।

+0

बहुत बहुत धन्यवाद। यह स्पष्टीकरण बहुत स्पष्ट है। क्या आप समझ सकते हैं कि जितना संभव हो उतना कसकर इसका मतलब क्या है? "* और + ऑपरेटर यथासंभव कसकर बांधते हैं" – ferry

+0

मुझे इस बारे में 100% निश्चित नहीं है क्योंकि शब्दावली परिभाषा कुछ है जो मुझे गहराई से नहीं उजागर किया गया है। मैं इसका अनुमान लगा रहा हूं कि इसका उच्च प्राथमिकता है, इसलिए, एक नियम 'a_rule :: = part1 | part2 * '(' | 'प्रतीक का मतलब ** या **) को' a_rule :: = part1 के रूप में हस्तक्षेप किया जाना चाहिए। (part2 *) 'और 'a_rule :: = (part1 | part2) *' के रूप में नहीं। मुझे उम्मीद है कि यह आपको कुछ समझ में आता है। –

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