पायथन: अपवाद को अनदेखा कैसे करें और आगे बढ़ें?


239

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

359
except: 
    pass 
+64

अपवाद को छोड़कर: पास # महत्वपूर्ण अन्य अपवादों को निगलने के लिए महत्वपूर्ण नहीं है! 22 feb. 092009-02-22 16:46:45

+8

@Aaron - मैं सहमत हूं, लेकिन सवाल यह नहीं था कि यह एक अच्छा/बुरा विचार 23 feb. 092009-02-23 20:05:24

+15

यह सिस्टमएक्सिट, कीबोर्ड इंटरप्ट और अन्य चीजें जो आप शायद पकड़ना नहीं चाहते हैं। 02 jan. 102010-01-02 01:13:31

+1

यह कीबोर्ड इंटरप्ट को पकड़ नहीं पाएगा। उदाहरण के लिए: 'जबकि यह सच है:' ' कोशिश: ' च = खुला ('filedoesnotexist.txt') '' को छोड़कर: '' KeyboardInterrupt बंद हो जाता है और कोड बाहर निकालता है pass'। 24 jul. 122012-07-24 15:59:51

+14

@ChthonicProject एक नंगे 'सिवाय' कुंजीपटल इंटरप्ट सहित किसी अपवाद को पकड़ लेगा, लेकिन केवल तभी होगा जब यह 'try' के अंदर होता है। आपके उदाहरण में, 'try' या' वगैरह 'के अंदर एक कीबोर्ड इंटरप्ट हो सकता है, जहां इसे पकड़ा नहीं जाएगा। यदि आप एक उदाहरण चलाते हैं जैसे 'True:' 'try: pass' 'को छोड़कर: पास', आप पाएंगे कि कीबोर्ड इंटरप्ट को लगभग 50% समय पकड़ा जाता है। यदि आप 'try' के अंदर' time.sleep (1) 'हैं, तो आप पाएंगे कि यह लगभग हर बार पकड़ा जाता है। 22 mar. 132013-03-22 08:39:50


12

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

try: 
    blah() 
except: 
    pass 

202

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

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

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

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

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

+26

यह स्वीकार किए जाने वाले एक से बेहतर जवाब है क्योंकि यह "छोड़कर:" के बजाय "अपवाद को छोड़कर" का उपयोग करता है, जैसा कि अन्य ने इंगित किया है कि अन्य चीजों को अनुचित रूप से निगलना होगा जिन्हें आप सिस्टमएक्सिट और कीबोर्ड इंटरप्ट की तरह पकड़ना नहीं चाहते हैं । 11 jul. 112011-07-11 21:50:28

+4

+1 यह त्रुटि को साफ़ करता है जो अवांछित चलने और अपवादों की अपेक्षा करते समय महत्वपूर्ण है 26 oct. 112011-10-26 13:50:55

  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/ 06 mar. 182018-03-06 18:59:18


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 के साथ बदल दिया है (कोशिश करें, छोड़कर, और पास सभी एक में विलय हो गए हैं।) मुख्य बात यह है कि मैं इस बात पर ध्यान देता हूं कि यह एक नया कीवर्ड कैसे पेश करता है जो कुछ सही साबित करता है आपको शायद ऐसा नहीं करना चाहिए ... ऐसा लगता है कि आपको हमेशा कम से कम लॉग अप अपवादों को देखना चाहिए ... 14 oct. 132013-10-14 13:13:09

  0

जब कोई अपवाद उठाया जाता है तो यह कोशिश/पकड़ने के बाद कोड जारी रखेगा या जो भी ' 'ब्लॉक के साथ? 13 nov. 132013-11-13 07:45:05

+1

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

+4

@ जैको 'कॉनर अच्छा, यह इसे बेकार बनाता है ... मैंने सोचा कि यह केवल वादे के रूप में अपवादों को अनदेखा कर देगा। 04 dec. 132013-12-04 20:21:50

+2

@ArtOfWarfare अगर मैंने कहा, तो मैं आपको एक पूर्णांक दूंगा, लेकिन कभी-कभी मैं इसे सिंगलटन टुपल में दूंगा, और जब मैं एक या दूसरे को करता हूं तो मैं आपको नहीं बताऊंगा; अब आपका काम हमेशा मुझे पूर्णांक वापस देना है? शायद आप की तरह कुछ लिखने के लिए सक्षम होने की सराहना करेंगे 'दबाने (लेखन त्रुटि) के साथ: वापसी डेटा [0]' (अब उदाहरण: http://pastebin.com/gcvAGqEP) 02 may. 142014-05-02 21:03:25

  0

@Navin अजगर सिर्फ एक अपवाद didn कि प्रतीत नहीं हो सकते अस्तित्व में नहीं है मान लीजिए मेरे पास 'y = f (x) * g (x)' जैसे बयान है, और फिर 'f (x) 'अपवाद उठाता है। यहां तक ​​कि यदि पायथन इसे अनदेखा करता है, तो 'एफ (एक्स)' कभी भी मूल्य नहीं लौटाता है, इसलिए पाइथन को 'y' के मान को असाइन करने का कोई तरीका नहीं है। डिजाइनर कह सकते हैं कि "किसी का मूल्य मानें" या "मूल्यांकन करने में असफल होने वाली किसी भी अभिव्यक्ति वाले बयान छोड़ें", लेकिन यह बहुत भ्रमित हो जाएगा। एक साथ विफल होने वाले समूह विवरणों के लिए 'try' ब्लॉक का उपयोग करना चीजों को सरल रखता है। 14 jan. 152015-01-14 17:14:23

  0

@ जैको 'कॉनर पर्याप्त मेला। मैं उम्मीद कर रहा था कि अगर कोई अपवाद उठाता है तो किसी के साथ अभिव्यक्तियों को प्रतिस्थापित करने का कोई तरीका नहीं होगा। 14 jan. 152015-01-14 18:07:12

  0

क्या यह इनलाइन किया जा सकता है? उदाहरण के लिए 'supress (myFunc, दबाए गए अपवाद, वापसीValueOnFailure)' जैसे कुछ? 23 jun. 152015-06-23 01:43:01

  0

@ जेरोमजे आप सीधे 'दबाने' के साथ ऐसा नहीं कर सकते, क्योंकि यह एक संदर्भ प्रबंधक है। (के बारे में कैसे संदर्भ प्रबंधकों काम जानकारी के लिए, यहाँ देखें: https://docs.python.org/3.4/library/stdtypes.html#typecontextmanager) लेकिन यह अपनी खुद की 'callCatchingExceptions' समारोह है कि' दबाने के लिए इस्तेमाल किया परिभाषित करने के लिए बहुत आसान होगा 'या यदि आप चाहते थे, तो अंदर एक सामान्य' कोशिश 'ब्लॉक। 24 jun. 152015-06-24 14:01:27

+1

एफवाईआई, डीजेंगो 2017-09 को 'दबाने (अपवाद)' के उपयोग को वापस लाता है, क्योंकि बेहतर प्रदर्शन करने की कोशिश/छोड़कर। इस करता है की जाँच करें [वापस लाया गया "फिक्स्ड # 27,818 - बदला ट्राई/छोड़कर/contextlib.su साथ पारित ...] (https://github.com/django/django/commit/6e4c6281dbb7ee12bcdc22620894edb4e9cf623f) 07 nov. 172017-11-07 07:00:17