पायथन 3 - अपवाद हैंडलिंग
पायथन अपने पायथन कार्यक्रमों में किसी भी अप्रत्याशित त्रुटि को संभालने के लिए और उनमें डिबगिंग क्षमताओं को जोड़ने के लिए दो बहुत ही महत्वपूर्ण सुविधाएँ प्रदान करता है -
Exception Handling- यह इस ट्यूटोरियल में शामिल किया जाएगा। यहाँ एक सूची मानक अपवाद पायथन में उपलब्ध है - मानक अपवाद ।
Assertions- यह अजगर 3 ट्यूटोरियल में जोर में कवर किया जाएगा ।
मानक अपवाद
यहाँ पायथन में उपलब्ध मानक अपवादों की एक सूची दी गई है। -
अनु क्रमांक। | अपवाद का नाम और विवरण |
---|---|
1 | Exception सभी अपवादों के लिए बेस क्लास |
2 | StopIteration उठाया जब एक पुनरावृत्ति के अगले () विधि किसी भी वस्तु को इंगित नहीं करता है। |
3 | SystemExit Sys.exit () फ़ंक्शन द्वारा उठाया गया। |
4 | StandardError StopIteration और SystemExit को छोड़कर सभी अंतर्निहित अपवादों के लिए बेस क्लास। |
5 | ArithmeticError संख्यात्मक गणना के लिए होने वाली सभी त्रुटियों के लिए बेस क्लास। |
6 | OverflowError उठाया जब एक संख्यात्मक प्रकार के लिए एक गणना अधिकतम सीमा से अधिक है। |
7 | FloatingPointError एक अस्थायी बिंदु गणना विफल होने पर उठाया गया। |
8 | ZeroDivisonError उठाया जब शून्य या modulo शून्य से सभी संख्यात्मक प्रकार के लिए जगह लेता है। |
9 | AssertionError एसेर कथन की विफलता के मामले में उठाया गया। |
10 | AttributeError विशेषता संदर्भ या असाइनमेंट की विफलता के मामले में उठाया गया। |
1 1 | EOFError उठाया गया जब कच्चे_input () या इनपुट () फ़ंक्शन से कोई इनपुट नहीं है और फ़ाइल का अंत तक पहुंच गया है। |
12 | ImportError आयात विवरण विफल होने पर उठाया गया। |
13 | KeyboardInterrupt जब उपयोगकर्ता प्रोग्राम निष्पादन को बाधित करता है, तो आमतौर पर Ctrl + c दबाकर उठाया जाता है। |
14 | LookupError सभी लुकअप त्रुटियों के लिए बेस क्लास। |
15 | IndexError जब एक अनुक्रम में एक अनुक्रम नहीं मिला तो उठाया। |
16 | KeyError शब्दकोश में निर्दिष्ट कुंजी नहीं मिलने पर उठाया। |
17 | NameError उठाया जब एक पहचानकर्ता स्थानीय या वैश्विक नाम स्थान में नहीं पाया जाता है। |
18 | UnboundLocalError किसी फ़ंक्शन या विधि में एक स्थानीय चर का उपयोग करने का प्रयास करते समय उठाया गया लेकिन इसका कोई मूल्य नहीं सौंपा गया है। |
19 | EnvironmentError पायथन पर्यावरण के बाहर होने वाले सभी अपवादों के लिए बेस क्लास। |
20 | IOError इनपुट / आउटपुट ऑपरेशन विफल होने पर उठाया जाता है, जैसे कि प्रिंट स्टेटमेंट या ओपन () फ़ंक्शन जब फ़ाइल को खोलने की कोशिश करता है जो मौजूद नहीं है। |
21 | OSError ऑपरेटिंग सिस्टम से संबंधित त्रुटियों के लिए उठाया गया। |
22 | SyntaxError पायथन सिंटैक्स में कोई त्रुटि होने पर उठाया गया। |
23 | IndentationError उठाया जब इंडेंटेशन ठीक से निर्दिष्ट नहीं है। |
24 | SystemError उठाया जब दुभाषिया एक आंतरिक समस्या पाता है, लेकिन जब यह त्रुटि सामने आती है तो पायथन दुभाषिया बाहर नहीं निकलता है। |
25 | SystemExit उठता है जब पायथन इंटरप्रिटर को sys.exit () फ़ंक्शन का उपयोग करके छोड़ दिया जाता है। यदि कोड में संभाला नहीं गया है, तो दुभाषिया से बाहर निकलने का कारण बनता है। |
26 | TypeError उठाया जब एक ऑपरेशन या फ़ंक्शन का प्रयास किया जाता है जो निर्दिष्ट डेटा प्रकार के लिए अमान्य है। |
27 | ValueError उठाया जब डेटा प्रकार के लिए अंतर्निहित फ़ंक्शन में मान्य प्रकार के तर्क होते हैं, लेकिन तर्कों में अमान्य मान निर्दिष्ट होते हैं। |
28 | RuntimeError जब उत्पन्न त्रुटि किसी भी श्रेणी में नहीं आती है तो उठाया गया। |
29 | NotImplementedError जब एक अमूर्त विधि जिसे विरासत में दिए गए वर्ग में लागू करने की आवश्यकता होती है, तो वास्तव में लागू नहीं किया जाता है। |
अजगर में जोर
एक सम्मान एक पवित्रता-जांच है जिसे आप कार्यक्रम के अपने परीक्षण के साथ पूरा करने पर चालू या बंद कर सकते हैं।
एक विचार करने के लिए सबसे आसान तरीका यह एक के लिए तुलना करने के लिए है raise-ifकथन (या अधिक सटीक होने के लिए, एक बढ़ा-चढ़ाकर बयान नहीं)। एक अभिव्यक्ति का परीक्षण किया जाता है, और यदि परिणाम गलत आता है, तो एक अपवाद उठाया जाता है।
अभिकथन कथन के द्वारा अभिकथन किया जाता है, पायथन में सबसे नया कीवर्ड, जिसे संस्करण 1.5 में प्रस्तुत किया गया है।
प्रोग्रामर अक्सर मान्य इनपुट के लिए जाँच करने के लिए किसी फ़ंक्शन की शुरुआत में, और मान्य आउटपुट के लिए जाँच करने के लिए फ़ंक्शन कॉल के बाद दावे करते हैं।
मुखर कथन
जब यह एक मुखर कथन का सामना करता है, तो पायथन साथ की अभिव्यक्ति का मूल्यांकन करता है, जो उम्मीद है कि सच है। यदि अभिव्यक्ति झूठी है, तो पायथन एक जोर-शोर से अपवाद उठाता है।
मुखर के लिए वाक्य रचना है -
assert Expression[, Arguments]
यदि दावा विफल हो जाता है, तो पायथन तर्क के रूप में तर्क का उपयोग करता है। प्रयास-अपवाद स्टेटमेंट का उपयोग करके किसी भी अन्य अपवाद की तरह जोरदार अपवादों को पकड़ा और संभाला जा सकता है। यदि उन्हें संभाला नहीं जाता है, तो वे कार्यक्रम को समाप्त कर देंगे और ट्रेसबैक का उत्पादन करेंगे।
उदाहरण
यहाँ एक फ़ंक्शन है जो किसी दिए गए तापमान को डिग्री केल्विन से डिग्री फ़ारेनहाइट में परिवर्तित करता है। चूँकि 0 ° K जितना ठंडा होता है, यह एक नकारात्मक तापमान देखता है, तो फ़ंक्शन बेल हो जाता है -
#!/usr/bin/python3
def KelvinToFahrenheit(Temperature):
assert (Temperature >= 0),"Colder than absolute zero!"
return ((Temperature-273)*1.8)+32
print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))
जब उपरोक्त कोड निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -
32.0
451
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!
अपवाद क्या है?
एक अपवाद एक घटना है, जो एक कार्यक्रम के निष्पादन के दौरान होता है जो कार्यक्रम के निर्देशों के सामान्य प्रवाह को बाधित करता है। सामान्य तौर पर, जब पाइथन स्क्रिप्ट एक ऐसी स्थिति का सामना करती है, जिसके साथ सामना नहीं किया जा सकता, तो यह एक अपवाद को जन्म देती है। एक अपवाद एक पायथन ऑब्जेक्ट है जो एक त्रुटि का प्रतिनिधित्व करता है।
जब पायथन स्क्रिप्ट एक अपवाद को उठाती है, तो उसे या तो तुरंत अपवाद को संभालना चाहिए अन्यथा यह समाप्त हो जाता है और समाप्त हो जाता है।
एक अपवाद को संभालना
यदि आपके पास कुछ संदिग्ध कोड हैं जो अपवाद उठा सकते हैं, तो आप संदिग्ध कोड को एक में रखकर अपने कार्यक्रम का बचाव कर सकते हैंtry:खंड मैथा। कोशिश के बाद: ब्लॉक, शामिल हैंexcept: कथन, कोड के एक ब्लॉक द्वारा पीछा किया जाता है जो समस्या को यथासंभव प्रभावी ढंग से संभालता है।
वाक्य - विन्यास
यहाँ कोशिश की सरल वाक्य रचना है .... को छोड़कर ... और ब्लॉक -
try:
You do your operations here
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
यहाँ उपर्युक्त वाक्यविन्यास के बारे में कुछ महत्वपूर्ण बिंदु हैं -
एक सिंगल स्टेटमेंट स्टेटमेंट में स्टेटमेंट्स को छोड़कर कई हो सकते हैं। यह तब उपयोगी होता है जब ट्राई ब्लॉक में ऐसे कथन होते हैं जो विभिन्न प्रकार के अपवादों को फेंक सकते हैं।
आप क्लॉज़ को छोड़कर एक जेनेरिक भी प्रदान कर सकते हैं, जो किसी भी अपवाद को संभालता है।
क्लॉज (एस) को छोड़कर, आप एक और-क्लॉज शामिल कर सकते हैं। अन्य-ब्लॉक में कोड निष्पादित करता है यदि कोड कोशिश में है: ब्लॉक अपवाद नहीं उठाता है।
अन्य-ब्लॉक कोड के लिए एक अच्छी जगह है जिसे कोशिश की आवश्यकता नहीं है: ब्लॉक की सुरक्षा।
उदाहरण
यह उदाहरण एक फ़ाइल खोलता है, में सामग्री लिखता है, फ़ाइल करता है और इनायत से बाहर आता है क्योंकि कोई समस्या नहीं है -
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
fh.close()
यह निम्न परिणाम उत्पन्न करता है -
Written content in the file successfully
उदाहरण
यह उदाहरण एक फ़ाइल को खोलने की कोशिश करता है जहां आपके पास लिखने की अनुमति नहीं है, इसलिए यह एक अपवाद उठाता है -
#!/usr/bin/python3
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print ("Error: can\'t find file or read data")
else:
print ("Written content in the file successfully")
यह निम्न परिणाम उत्पन्न करता है -
Error: can't find file or read data
अपवाद के अलावा कोई अपवाद नहीं है
आप अपवाद को छोड़कर इस कथन का उपयोग भी कर सकते हैं, जो इस प्रकार है -
try:
You do your operations here
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
इस तरह का ए try-exceptबयान सभी अपवादों को पकड़ता है जो घटित होते हैं। इस तरह की कोशिश को छोड़कर बयान का उपयोग करना एक अच्छा प्रोग्रामिंग अभ्यास नहीं माना जाता है, क्योंकि यह सभी अपवादों को पकड़ता है, लेकिन प्रोग्रामर को समस्या के मूल कारण की पहचान नहीं करता है जो हो सकता है।
कई अपवादों को छोड़कर खंड
आप कई अपवादों को संभालने के लिए कथन को छोड़कर उसी का उपयोग कर सकते हैं -
try:
You do your operations here
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
कोशिश-अंत में खंड
आप एक का उपयोग कर सकते हैं finally: साथ में ब्लॉक करें try:खंड मैथा। finally:ब्लॉक किसी भी कोड को डालने के लिए एक जगह है जिसे निष्पादित करना होगा, चाहे कोशिश-ब्लॉक ने एक अपवाद उठाया या नहीं। कोशिश-आखिर बयान का वाक्य विन्यास यह है -
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Note- आप क्लॉज (एस), या अंत में क्लॉज को छोड़कर प्रदान कर सकते हैं, लेकिन दोनों को नहीं। आप किसी अन्य क्लॉज के साथ-साथ अंतिम क्लॉज का उपयोग नहीं कर सकते ।
उदाहरण
#!/usr/bin/python3
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print ("Error: can\'t find file or read data")
fh.close()
यदि आपके पास लिखित मोड में फ़ाइल खोलने की अनुमति नहीं है, तो यह निम्नलिखित परिणाम देगा -
Error: can't find file or read data
एक ही उदाहरण को अधिक सफाई से इस प्रकार लिखा जा सकता है -
#!/usr/bin/python3
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print ("Going to close the file")
fh.close()
except IOError:
print ("Error: can\'t find file or read data")
यह निम्न परिणाम उत्पन्न करता है -
Going to close the file
जब एक अपवाद को कोशिश ब्लॉक में फेंक दिया जाता है , तो निष्पादन तुरंत अंत में ब्लॉक में जाता है। आखिरकार ब्लॉक में सभी कथनों को निष्पादित किया जाता है, अपवाद फिर से उठाया जाता है और अपवाद वाले बयानों में संभाला जाता है यदि प्रयास-अपवाद कथन की अगली उच्चतर परत में मौजूद हो ।
एक अपवाद का तर्क
एक अपवाद में एक तर्क हो सकता है , जो एक मूल्य है जो समस्या के बारे में अतिरिक्त जानकारी देता है। तर्क की सामग्री अपवाद से भिन्न होती है। आप निम्न खंड में एक चर की आपूर्ति करके अपवाद के तर्क को पकड़ते हैं -
try:
You do your operations here
......................
except ExceptionType as Argument:
You can print value of Argument here...
यदि आप किसी एकल अपवाद को संभालने के लिए कोड लिखते हैं, तो आपके पास अपवाद के अपवाद को छोड़कर अपवाद कथन का अनुसरण कर सकते हैं। यदि आप कई अपवादों को फँसा रहे हैं, तो आप अपवाद के tuple का अनुसरण कर सकते हैं।
यह चर अपवाद का मूल्य प्राप्त करता है जिसमें अधिकतर अपवाद का कारण होता है। चर एक ट्यूपल के रूप में एक एकल मान या कई मान प्राप्त कर सकता है। इस ट्यूपल में आमतौर पर त्रुटि स्ट्रिंग, त्रुटि संख्या और एक त्रुटि स्थान होता है।
उदाहरण
निम्नलिखित एकल अपवाद के लिए एक उदाहरण है -
#!/usr/bin/python3
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError as Argument:
print ("The argument does not contain numbers\n", Argument)
# Call above function here.
temp_convert("xyz")
यह निम्न परिणाम उत्पन्न करता है -
The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'
एक अपवाद उठाना
आप ऊपर बयान का उपयोग करके कई तरीकों से अपवाद उठा सकते हैं। के लिए सामान्य वाक्यविन्यासraise कथन इस प्रकार है -
वाक्य - विन्यास
raise [Exception [, args [, traceback]]]
यहां, अपवाद अपवाद का प्रकार है (उदाहरण के लिए, NameError) और तर्क अपवाद तर्क के लिए एक मान है। तर्क वैकल्पिक है; यदि आपूर्ति नहीं की गई है, तो अपवाद तर्क कोई भी नहीं है।
अंतिम तर्क, ट्रेसबैक, वैकल्पिक भी है (और शायद ही कभी व्यवहार में उपयोग किया जाता है), और यदि मौजूद है, तो ट्रेसबैक ऑब्जेक्ट अपवाद के लिए उपयोग किया जाता है।
उदाहरण
एक अपवाद एक स्ट्रिंग, एक कक्षा या एक वस्तु हो सकता है। पायथन कोर द्वारा उठाए गए अधिकांश अपवाद एक तर्क के साथ वर्ग हैं, जो वर्ग का एक उदाहरण है। नए अपवादों को परिभाषित करना काफी आसान है और निम्नानुसार किया जा सकता है -
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
Note- एक अपवाद को पकड़ने के लिए, एक "को छोड़कर" खंड को उसी अपवाद को संदर्भित करना चाहिए जिसे या तो क्लास ऑब्जेक्ट या एक साधारण स्ट्रिंग के रूप में फेंक दिया गया हो। उदाहरण के लिए, उपरोक्त अपवाद को पकड़ने के लिए, हमें निम्न खंड को छोड़कर लिखना होगा -
try:
Business Logic here...
except Exception as e:
Exception handling here using e.args...
else:
Rest of the code here...
निम्नलिखित उदाहरण एक अपवाद को बढ़ाने के उपयोग को दर्शाता है -
#!/usr/bin/python3
def functionName( level ):
if level <1:
raise Exception(level)
# The code below to this would not be executed
# if we raise the exception
return level
try:
l = functionName(-10)
print ("level = ",l)
except Exception as e:
print ("error in level argument",e.args[0])
यह निम्नलिखित परिणाम का उत्पादन करेगा
error in level argument -10
उपयोगकर्ता-परिभाषित अपवाद
पायथन भी आपको मानक निर्मित अपवादों से कक्षाओं को प्राप्त करके अपने स्वयं के अपवाद बनाने की अनुमति देता है।
यहाँ RuntimeError से संबंधित एक उदाहरण है । यहाँ, एक वर्ग बनाया गया है जो RuntimeError से उपवर्गित है । यह तब उपयोगी होता है जब आपको अपवाद के पकड़े जाने पर अधिक विशिष्ट जानकारी प्रदर्शित करने की आवश्यकता होती है।
कोशिश ब्लॉक में, उपयोगकर्ता-परिभाषित अपवाद को उठाया जाता है और अपवाद ब्लॉक में पकड़ा जाता है। चर का उपयोग वर्ग Networkerror का एक उदाहरण बनाने के लिए किया जाता है ।
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
इसलिए एक बार जब आप उपरोक्त वर्ग को परिभाषित कर लेते हैं, तो आप अपवाद को निम्न प्रकार से उठा सकते हैं -
try:
raise Networkerror("Bad hostname")
except Networkerror,e:
print e.args