2012-11-17 10 views
12

में अन्यथा सही तरीके से प्रयास करने का प्रयास कैसे करें, इसलिए मैं जानना चाहता हूं कि कथन को छोड़कर प्रयास लिखने का सही तरीका कौन सा है। मैं पाइथन में त्रुटि प्रबंधन में नया हूं।पायथन

विकल्प 1

try: 
    itemCode = items["itemCode"] 
    dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get() 
    dbObject.delete() 
except AttributeError: 
    print "There's no item with that code" 
except KeyError: 
    print "Bad parameter name" 
except: 
    print "Unknow error" 

विकल्प 2

try: 
    itemCode = items["itemCode"] 
except KeyError: 
    print "Bad parameter name" 
else:  
    dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get() 
    try:  
     dbObject.delete() 
    except AttributeError: 
     print "There's no item with that code" 
    except: 
     print "Unknow error" 

विकल्प 3 कोई अन्य बेहतर विकल्प आप सोच सकते हैं।

विकल्प 1, हम देखते हैं कि मैं सभी कोड को एक कोशिश ब्लॉक में लपेटता हूं। विकल्प 2, यह नेस्टेड ब्लॉक का उपयोग करता है। यह विशिष्ट लाइन विवरणों पर एक अपवाद उठाता है।

यदि कहीं कोई त्रुटि है तो मुझे इसके बारे में जानकर खुशी होगी।

+0

मैं आपके प्रश्न को पूरी तरह से समझ नहीं पा रहा हूं। ऐसा लगता है कि आपकी प्राथमिक समस्या यह समझने के साथ है कि कैसे कोशिश करें, छोड़कर, आखिरकार काम करता है। क्या वो सही है? यदि ऐसा है, तो मैं एक उदाहरण प्रदान कर सकता हूं जो इसे समझाता है। – inspectorG4dget

+0

@ इंस्पेक्टर जी 4 डीजेट - मुझे लगता है कि सवाल यह है कि वे कैसे काम करते हैं (दोनों उदाहरण मान्य हैं) और एक स्टाइलिस्ट वरीयता प्रश्न है। –

+0

मुझे समझ में नहीं आ रहा है कि आप ऑब्जेक्ट को 'प्रयास' में क्यों हटा रहे हैं: 'ब्लॉक और' 'else:' 'ब्लॉक, क्या मुझे कुछ याद आ रही है या क्या यह समझ में नहीं आता है? –

उत्तर

-1

KeyError को पकड़ने के बजाय, मैं सत्यापन के साथ dicts प्राप्त विधि का उपयोग करना पसंद करते हैं।

itemCode = items.get("itemCode") # itemCode will be None, if no such key 
if itemCode is not None: 
    print "code missing" 

यह "सामान्य" समाधान नहीं है (मेरे उत्तर पर टिप्पणियां देखें), लेकिन इस मामले में यह मदद करेगा।

और पहले मामले में मुझे समझ में नहीं आता, आप दो बार हटाने की कोशिश क्यों कर रहे हैं।

try: 
    itemCode = items.get("itemCode") # itemCode will be None, if no such key 
    if itemCode is not None: 
     print "code missing" 
    dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get() 
    dbObject.delete() 
except AttributeError: 
    print "There's no item with that code" 
except StandardError as ex: # good idea to be prepared to handle various fails 
    print "Unexpected error deleting item {}".format(ex) 

और यह भी भूलें कि अजगर अंत में अनुभाग है। यह कभी-कभी काम में आता है।

+2

यह बहुत ही पाइथोनिक दृष्टिकोण नहीं है, क्योंकि आपका कोड विफल रहता है, जहां 'आइटम [' itemCode '] '0',' गलत', '[]', '{}', या कुछ भी जो ' FALSE'। 'कोशिश करें'/'को छोड़कर 'इस स्थिति में बहुत पसंद किया जाता है क्योंकि यह वास्तव में उस विशिष्ट मामले को पकड़ता है जहां आइटम नहीं मिला था। झूठे सकारात्मक नहीं हैं कि 'अगर आइटम कोड नहीं' हो सकता है। –

+0

हाँ, मैं वास्तव में क्षमा चाहता हूं, यह मेरी गलती है (वास्तव में थक गया और जल्दी जवाब देने की कोशिश की)। निश्चित रूप से, 'कोई नहीं है' और 'कोई नहीं है' का उपयोग हमेशा यह जांचने के लिए किया जाना चाहिए कि मूल्य कोई नहीं है (या नहीं)। मैंने कोड सही किया है। – cleg

+0

कोई क्षमा नहीं।हम सब यहाँ एक साथ इस सामान के माध्यम से काम करने की कोशिश कर रहे हैं। :-) लेकिन नए कोड में भी, आप 'आइटम कोड' के बीच अंतर नहीं बता सकते हैं 'आइटम' और 'आइटम [' itemcode '] में कोई नहीं है। 'कोई नहीं' स्टोर करने के लिए एक बिल्कुल मान्य मूल्य है, और 'कोई नहीं' और 'KeyError' के बीच एक बड़ा अंतर है। –

4

पायथन के जेन से, "फ्लैट नेस्टेड से बेहतर है।" मैं सामान्य रूप से विकल्प # 1 शैली के साथ जाऊंगा, हालांकि मैं थोड़ा उलझन में हूं कि dbObject=db.GqlQuery("SELECT.... या dbObject.delete()AttributeError उठाता है। हालांकि, किसी भी मामले में, आपको dbObject.delete() को एक से अधिक बार कॉल नहीं करना चाहिए।

+0

मेरा बुरा, मैंने डबल हटाना तय किया। dbObject.delete() विशेषता Error –

+0

उठाता है सभी त्रुटियों को पकड़ना और उन्हें सरल "अज्ञात त्रुटि" संदेश से छिपाना अच्छा नहीं है। यह समझना मुश्किल है, क्या हुआ, जब आप इस तरह के त्रुटि संदेश देखते हैं। – cleg

+0

@cleg यह उन त्रुटियों के लिए है जिन्हें मैं नहीं जानता। जब वे आएंगे तो मैं उन्हें पकड़ूंगा –

0

सरल - यह निर्भर करता है। यदि आप निश्चित हैं कि आप किस अपवाद को प्राप्त करने जा रहे हैं, तो आप 1 के साथ रह सकते हैं) और स्पष्ट रूप से, यह 90% समय है। दूसरा तरीका उपयोगी है यदि आप जानते हैं कि कई कोड दिनचर्या एक ही अपवाद प्रकार को बढ़ा सकते हैं।