मैं एक ऐसा try
/ except
ब्लॉक कैसे लिख सकता हूं जो सभी अपवादों को पकड़ता है?
sys.stderr
और संभवतः लॉग किए जाते हैं। यह पूरी तरह से मान्य और सामान्य अपवाद है।
try: whatever() except Exception as e: exp_capture()
?
मैं एक ऐसा try
/ except
ब्लॉक कैसे लिख सकता हूं जो सभी अपवादों को पकड़ता है?
sys.stderr
और संभवतः लॉग किए जाते हैं। यह पूरी तरह से मान्य और सामान्य अपवाद है।
try: whatever() except Exception as e: exp_capture()
?
जवाबों:
आप कर सकते हैं लेकिन आप शायद नहीं करना चाहिए:
try:
do_something()
except:
print "Caught it!"
हालाँकि, यह भी अपवादों को पकड़ लेगा KeyboardInterrupt
और आप आमतौर पर ऐसा नहीं चाहते हैं, क्या आप? जब तक आप तुरंत अपवाद को फिर से नहीं बढ़ाते हैं - डॉक्स से निम्न उदाहरण देखें :
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
except Exception:
से नंगे कहने की आवश्यकता है, सिवाय इसके कि आपके पास BaseException वालों को भी पकड़ा जाएगा।
एक नंगे except:
क्लॉज़ के अलावा (जैसा कि दूसरों ने कहा है कि आपको उपयोग नहीं करना चाहिए), आप बस पकड़ सकते हैं Exception
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
आप आमतौर पर कभी भी अपने कोड के सबसे बाहरी स्तर पर ऐसा करने पर विचार करेंगे यदि उदाहरण के लिए आप समाप्त करने से पहले किसी भी अन्यथा अनुपलब्ध अपवाद को संभालना चाहते थे।
except Exception
नंगे पर लाभ यह except
है कि कुछ अपवाद हैं जो इसे पकड़ नहीं सकते हैं, सबसे स्पष्ट रूप से KeyboardInterrupt
और SystemExit
: यदि आपने उन्हें पकड़ा और निगल लिया तो आप किसी को भी अपनी स्क्रिप्ट से बाहर निकलने के लिए कठिन बना सकते हैं।
Exception
। ध्यान दें कि int
एक अपवाद के रूप में उठाना असंभव है, और ऐसा करने का प्रयास एक TypeError
अपवाद को जन्म देता है, जो कि except Exception
ऐसे मामले में संलग्नक खंड द्वारा पकड़ा जाएगा । दूसरी ओर, एक पुरानी शैली के वर्ग को उठाया जा सकता है और एक "गैर-अपवाद" के रूप में अर्हता प्राप्त करता है जो उपवर्ग नहीं करता है Exception
- यह एक नंगे खंड द्वारा पकड़ा जाएगा,except
लेकिन एक खंड द्वारा नहींexcept Exception
।
TypeError
sys.exit()
आमतौर पर कॉल करने का मतलब है कि आप एप्लिकेशन को समाप्त करने की उम्मीद करते हैं लेकिन यदि आप SystemExit को पकड़ते हैं तो यह नहीं होगा। इसी तरह अगर आप एक रनिंग स्क्रिप्ट पर कंट्रोल-सी मारते हैं (विंडोज़ पर Ctrl-break) तो आप प्रोग्राम को बंद करने की उम्मीद करते हैं, न कि त्रुटि को पकड़ने और चलते रहने की। लेकिन आप या तो इन दोनों को पकड़ सकते हैं यदि आप मौजूदा से पहले सफाई करना चाहते हैं।
सामान्य अपवादों को संभालने के लिए आप ऐसा कर सकते हैं
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
सभी संभावित अपवादों को पकड़ने के लिए, पकड़ना BaseException
। यह अपवाद पदानुक्रम के शीर्ष पर है:
पायथन 3: https://docs.python.org/3.5/library/exception.html#exception-hierarchy
पायथन 2.7: https://docs.python.org/2.7/library/exception.html#exception-hierarchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
लेकिन जैसा कि अन्य लोगों ने उल्लेख किया है, आपको आमतौर पर केवल विशिष्ट मामलों के लिए इसकी आवश्यकता नहीं होगी।
बहुत ही सरल उदाहरण, यहाँ पाए जाने वाले के समान:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
यदि आप सभी अपवादों को पकड़ने का प्रयास कर रहे हैं, तो अपने सभी कोड "प्रयास:" कथन के भीतर रखें, 'प्रिंट' के स्थान पर एक क्रिया करना जो एक अपवाद को फेंक सकता है। ""।
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
उपरोक्त उदाहरण में, आप इस क्रम में आउटपुट देखेंगे:
1) एक कार्रवाई करना जो एक अपवाद फेंक सकता है।
2) अंत में कोशिश बयान को निष्पादित करने के बाद सीधे कहा जाता है कि क्या एक अपवाद फेंक दिया गया है या नहीं।
3) "एक अपवाद फेंक दिया गया था!" या "सब कुछ बहुत अच्छा लग रहा है!" इस पर निर्भर करता है कि क्या एक अपवाद फेंका गया था।
उम्मीद है की यह मदद करेगा!
विशेष रूप से पायथन 3.0 और इसके बाद के संस्करण को करने के कई तरीके हैं
दृष्टिकोण १
यह सरल दृष्टिकोण है लेकिन अनुशंसित नहीं है क्योंकि आपको पता नहीं होगा कि वास्तव में कोड की कौन सी पंक्ति अपवाद को फेंक रही है:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
दृष्टिकोण २
यह दृष्टिकोण अनुशंसित है क्योंकि यह प्रत्येक अपवाद के बारे में अधिक विवरण प्रदान करता है। उसमे समाविष्ट हैं:
केवल दोष यह है कि आयात किए जाने की आवश्यकता है।
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
मुझे अभी परीक्षण के लिए इस छोटी सी चाल का पता चला है यदि पायथन 2.7 में अपवाद नाम। कभी-कभी मैंने कोड में विशिष्ट अपवादों को संभाला है, इसलिए मुझे यह देखने के लिए एक परीक्षण की आवश्यकता है कि क्या नाम संभाले गए अपवादों की सूची में है।
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__name__ # returns the name of the exception
try:
whatever()
except:
# this will catch any exception or error
यह ध्यान देने योग्य है कि यह उचित पायथन कोडिंग नहीं है। यह उन कई त्रुटियों को भी पकड़ लेगा जिन्हें आप पकड़ना नहीं चाहते हैं।