2009-02-22 19 views
239

मेरे पास कोशिश है ... मेरे कोड में ब्लॉक को छोड़कर और जब कोई अपवाद फेंक दिया जाता है। मैं वास्तव में सिर्फ कोड के साथ जारी रखना चाहता हूं क्योंकि उस स्थिति में, सबकुछ अभी भी ठीक चलने में सक्षम है। समस्या यह है कि यदि आप इसे छोड़कर छोड़ते हैं: खाली ब्लॉक करें या #do कुछ भी नहीं, तो यह आपको एक वाक्यविन्यास त्रुटि देता है। मैं जारी रखने का उपयोग नहीं कर सकता क्योंकि यह एक लूप में नहीं है। क्या कोई ऐसा कीवर्ड है जिसका मैं उपयोग कर सकता हूं जो कोड को जारी रखने के लिए कहता है?पायथन: अपवाद को अनदेखा कैसे करें और आगे बढ़ें?

उत्तर

359
except: 
    pass 
+64

अपवाद को छोड़कर: पास # महत्वपूर्ण अन्य अपवादों को निगलने के लिए महत्वपूर्ण नहीं है! –

+8

@Aaron - मैं सहमत हूं, लेकिन सवाल यह नहीं था कि यह एक अच्छा/बुरा विचार – David

+15

यह सिस्टमएक्सिट, कीबोर्ड इंटरप्ट और अन्य चीजें जो आप शायद पकड़ना नहीं चाहते हैं। – FogleBird

12

इस प्रयास करें:

try: 
    blah() 
except: 
    pass 
202

मानक "nop" पायथन में pass कथन है:

try: 
    do_something() 
except Exception: 
    pass 
पिछले फेंका अपवाद के कारण

अजगर में याद किया जा रहा है, के कुछ अपवाद-फेंकने वाले कथन में शामिल वस्तुओं को अनिश्चित काल तक (वास्तव में, अगले अपवाद तक) रखा जा रहा है। मामले में यह आपके लिए महत्वपूर्ण है और (आमतौर पर) आप पिछले फेंका अपवाद को याद करने की जरूरत नहीं है, आप pass के बजाय निम्न करने के लिए चाहते हो सकता है:

try: 
    do_something() 
except Exception: 
    sys.exc_clear() 

यह पिछले फेंका अपवाद साफ करता है।

+26

यह स्वीकार किए जाने वाले एक से बेहतर जवाब है क्योंकि यह "छोड़कर:" के बजाय "अपवाद को छोड़कर" का उपयोग करता है, जैसा कि अन्य ने इंगित किया है कि अन्य चीजों को अनुचित रूप से निगलना होगा जिन्हें आप सिस्टमएक्सिट और कीबोर्ड इंटरप्ट की तरह पकड़ना नहीं चाहते हैं । – aculich

+4

+1 यह त्रुटि को साफ़ करता है जो अवांछित चलने और अपवादों की अपेक्षा करते समय महत्वपूर्ण है – geographika

+0

ध्यान दें कि 'exc_clear' को पायथन 3 में हटा दिया गया था। Https: // docs।python.org/3/whatsnew/3.0.html#index-22। पाइथन 3 में इसे संबोधित करने के कुछ तरीकों के लिए यहां देखें: https://cosmicpercolator.com/2016/01/13/exception-leaks-in-python-2-and-3/ – bcattle

114

ऐसा करने के लिए एक नया तरीका अजगर 3.4 में आ रहा है:

from contextlib import suppress 

with suppress(Exception): 
    # your code 

यहाँ प्रतिबद्ध है कि यह जोड़ा है: http://hg.python.org/cpython/rev/406b47c64480

और यहाँ लेखक, रेमंड Hettinger, इस बारे में बात कर रहा है और हर तरह की अन्य अजगर hotness (43:30 पर प्रासंगिक बिट): http://www.youtube.com/watch?v=OSGv2VnC0go

यदि आप नंगे except कीवर्ड का अनुकरण करने के लिए और भी KeyboardInterrupt तरह बातें -though आप आमतौर पर नहीं है-आप कर सकते थे उपेक्षा करना चाहता था with suppress(BaseException) का उपयोग करें।

संपादित करें: ignored को 3.4 रिलीज़ से पहले suppress का नाम बदल दिया गया था।

+1

मुझे यकीन नहीं है कि मुझे यह समाधान पसंद है ... मुझे लगता है कि हमने विचार किया है कि हमने 3 लाइनों को केवल 1 के साथ बदल दिया है (कोशिश करें, छोड़कर, और पास सभी एक में विलय हो गए हैं।) मुख्य बात यह है कि मैं इस बात पर ध्यान देता हूं कि यह एक नया कीवर्ड कैसे पेश करता है जो कुछ सही साबित करता है आपको शायद ऐसा नहीं करना चाहिए ... ऐसा लगता है कि आपको हमेशा कम से कम लॉग अप अपवादों को देखना चाहिए ... – ArtOfWarfare

+0

जब कोई अपवाद उठाया जाता है तो यह कोशिश/पकड़ने के बाद कोड जारी रखेगा या जो भी ' 'ब्लॉक के साथ? – Mikhail

+1

यह आपके कोड को 'कोशिश करें ... पकड़ो: पास' में लपेटने के बराबर है, इसलिए यदि ब्लॉक के अंदर कोई अपवाद उठाया गया है, तो ब्लॉक के अंत के बाद निष्पादन जारी रहेगा। –

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