Python Try Except - उदाहरणांसह Python हँडलिंग अपवाद

हे ट्यूटोरियल प्रोग्रामिंग उदाहरणांच्या मदतीने ट्राय एक्स्पेप्ट ब्लॉक वापरून पायथनमधील अपवाद हाताळणीचे स्पष्टीकरण देते:

दोन त्रुटी प्रकारांमुळे पायथन प्रोग्राम अचानक बंद होऊ शकतो म्हणजे सिंटॅक्स त्रुटी , आणि अपवाद . या ट्युटोरियलमध्ये, आम्ही अनेक महत्त्वाच्या विषयांखाली दुसऱ्या त्रुटी प्रकारावर (अपवाद) चर्चा करणार आहोत.

आमच्या अनुप्रयोगातील अपवाद हाताळून आम्हाला खूप फायदा होईल जसे की:

  • एक मजबूत ऍप्लिकेशन तयार करणे.
  • स्वच्छ आणि त्रुटी-मुक्त कोड तयार करणे.

पायथन वापरून पहा

एक चांगली बातमी अशी आहे की आमच्या कोडमधील त्रुटी पकडण्यासाठी पायथनमध्ये अनेक अंगभूत अपवाद आहेत. तसेच, कोणताही अंगभूत अपवाद आमच्या गरजेनुसार नसताना सानुकूल अपवाद तयार करण्याची संधी देते.

अपवाद म्हणजे काय

तर पायथनमध्ये अपवाद काय आहे? बरं, सोप्या भाषेत, जेव्हा जेव्हा पायथन इंटरप्रिटर अवैध कोड कार्यान्वित करण्याचा प्रयत्न करतो तेव्हा तो एक अपवाद वाढवतो आणि ज्या प्रकरणांमध्ये असा अपवाद हाताळला जात नाही, तो प्रोग्रामच्या सूचनांचा सामान्य प्रवाह व्यत्यय आणतो आणि ट्रेसबॅक प्रिंट करतो.

चला एक अवैध कोड तयार करू आणि पायथन इंटरप्रिटर कसा प्रतिसाद देईल ते पाहू.

पायथन शेल उघडा आणि खालील कोड चालवा.

>>> 50/0

हा एक आहे. प्रोग्रामिंगमधील सर्वात सामान्य त्रुटी. वरील कोड 50 या संख्येला 0 (शून्य) ने विभाजित करण्याचा प्रयत्न करतो. अजगरव्हेरिएबल openFile नियुक्त करण्यापूर्वी.

येथे एक छोटी युक्ती म्हणजे फायनल-ब्लॉकमध्ये अपवाद हँडलर वापरणे.

def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: try: print("Cleaning...") openFile.close() except: # catches all exceptions pass # Ignore this error because we don't care. if __name__ == '__main__': filePath = './text.txt' readFile(filePath) 

जर आमच्या ट्राय-ब्लॉकने FileNotFoundError वाढवले, तर आमच्याकडे खालील आउटपुट असेल

Raise Exception

Python अपवादांबद्दल एक चांगली बातमी म्हणजे आपण जाणूनबुजून त्यांना वाढवा. अपवाद रेज स्टेटमेंट सह वाढवले ​​जातात.

रेज स्टेटमेंटमध्ये खालील वाक्यरचना आहे:

raise [ExceptionName[(*args: Object)]]

टर्मिनल उघडा आणि वरून कोणताही अपवाद ऑब्जेक्ट वाढवा पायथन इन-बिल्ट अपवाद. उदाहरणार्थ, जर आपण ZeroDivisionError:

>>> raise ZeroDivisionError("Can't divide by zero")

आम्हाला ट्रेसबॅक मिळेल:

तर, अपवाद वाढवणे महत्त्वाचे का आहे?

  • सानुकूल अपवादांसह काम करताना.
  • सॅनिटी तपासणी दरम्यान.

सानुकूल अपवाद वर्ग

तुम्ही तुमच्या गरजेनुसार विशिष्ट त्रुटी हाताळण्यासाठी तयार केलेला एक सानुकूल अपवाद आहे. युक्ती अशी आहे की, आम्ही अपवाद ऑब्जेक्ट मधून प्राप्त होणारा वर्ग परिभाषित करतो, नंतर आम्ही आमचा अपवाद वर्ग वाढवण्यासाठी raise स्टेटमेंट वापरतो.

समजा आम्हाला वापरकर्ता इनपुट तपासायचे आहे आणि खात्री करायची आहे. इनपुट मूल्य नकारात्मक नाही (सॅनिटी चेक). अर्थात, आम्ही Python अपवाद ValueError वाढवू शकतो परंतु आम्ही त्रुटीला InputIsNegativeError सारखे विशिष्ट आणि स्वयं-स्पष्टीकरणात्मक नाव देऊन सानुकूलित करू इच्छितो. पण हा अपवाद अंगभूत पायथन नाहीअपवाद.

म्हणून प्रथम, आम्ही आमचा बेस क्लास तयार करतो जो Exception मधून प्राप्त होईल.

class CustomError(Exception): "Base class exception for all exceptions of this module" pass 

मग आम्ही आमचा अपवाद क्लास तयार करतो जो बेस क्लास इनहेरिट करेल आणि आमची विशिष्ट त्रुटी हाताळेल.

class InputIsNegativeError(CustomError): """Raised when User enters a negative value""" pass 

याची चाचणी करूया

try: value = int(input()) if value  0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print("Input value shouldn't be negative") 

उपयोगकर्ता इनपुटसाठी वरील कोड विनंती, आणि ती नकारात्मक आहे का ते तपासा. खरे असल्यास, ते आमची सानुकूल अपवाद InputIsNegativeError वाढवते जी नंतर अपवाद-विधानात पकडली जाते.

खाली संपूर्ण कोड आहे:

class CustomError(Exception): "Base class exception for all exceptions of this module" pass class InputIsNegativeError(CustomError): """Raised when User enters a negative value""" pass if __name__ == '__main__': try: value = int(input("Input a number: ")) if value  0: raise InputIsNegativeError # Raise exception if value is negative except InputIsNegativeError: # catch and handle exception print("Input value shouldn't be negative") 

इनपुट मूल्य असल्यास -1 सारखी ऋण संख्या आहे, नंतर आमच्याकडे आउटपुट असेल:

पायथॉन सानुकूल अपवादांबद्दल अधिक तपशीलांसाठी पायथन डॉक पहा.

वारंवार विचारले जाणारे प्रश्न

प्रश्न #1) पायथन अपवाद कसे हाताळतो?

उत्तर: पायथन वापरून अपवाद हाताळतो प्रयत्न-वगळून विधान . अपवाद वाढवू शकणारा कोड प्रयत्न ब्लॉक मध्ये ठेवला जातो आणि अंमलात आणला जातो, तर ब्लॉक सोडून हा कोड असतो जो अपवाद असल्यास ते हाताळेल.

प्रश्न #2) पायथनमध्ये अपवाद वाढवणे म्हणजे काय?

उत्तर: जेव्हा जेव्हा पायथन इंटरप्रिटरला अवैध कोड येतो, तेव्हा तो एक अपवाद वाढवतो, जो पायथनचा स्वतःचा मार्ग आहे. काहीतरी अनपेक्षित घडले हे सांगण्यासाठी. आम्ही जाणूनबुजून रेज स्टेटमेंट वापरून अपवाद वाढवू शकतो.

प्र #3) पायथन एकाधिक अपवाद कसे हाताळते?

उत्तर: Python अनेक अपवाद हाताळतेएकतर ब्लॉक वगळता एक किंवा ब्लॉक वगळता एकाधिक वापरणे.

एकल ब्लॉकसाठी, अपवाद टपल म्हणून पास केले जातात: वगळता (अपवाद1, अपवाद2,..,अपवादN) आणि पायथन चेक उजवीकडून डावीकडे सामन्यासाठी. या प्रकरणात, प्रत्येक अपवादासाठी समान क्रिया केली जाते.

सर्व अपवाद पकडण्याचा दुसरा मार्ग म्हणजे अपवादाचे नाव वगळता कीवर्ड नंतर सोडून देणे.

except: # handle all exceptions here

दुसरा मार्ग आहे प्रत्येक अपवादासाठी अपवाद वगळता ब्लॉक वापरण्यासाठी:

except Exception1: # code to handle Exception1 goes here except Exception2: # code to handle Exception2 goes here except ExceptionN: # code to handle ExceptionN goes here 

अशा प्रकारे, तुम्ही प्रत्येक अपवादासाठी स्वतंत्र कृती करू शकता.

प्र # 4) पायथॉनमध्ये अपवाद हाताळणे महत्त्वाचे का आहे?

उत्तर: पायथनमधील अपवाद हाताळण्याचा फायदा म्हणजे आपण मजबूत, स्वच्छ आणि त्रुटी-मुक्त अनुप्रयोग तयार करू शकतो. काही त्रुटींमुळे आमचा उत्पादन कोड क्रॅश होऊ नये अशी आमची इच्छा आहे, म्हणून आम्ही त्रुटी हाताळतो आणि आमचा अनुप्रयोग चालू ठेवतो.

प्रश्न # 5) तुम्ही पायथनमधील अपवादाकडे दुर्लक्ष कसे कराल?

उत्तर: पायथॉनमधील अपवादाकडे दुर्लक्ष करण्यासाठी, अपवाद वगळता ब्लॉकमध्ये पास कीवर्ड वापरा. मानूया की आम्ही ValueError अपवादाकडे दुर्लक्ष करू इच्छितो. आम्ही हे अशा प्रकारे करू:

except ValueError: pass

तुम्ही काय करत आहात हे तुम्हाला माहीत असल्याशिवाय, अपवादांकडे दुर्लक्ष करणे ही वाईट प्रथा आहे. किमान, सर्व संभाव्य त्रुटींबद्दल वापरकर्त्याला माहिती द्या.

निष्कर्ष

या ट्युटोरियलमध्ये, आम्ही समाविष्ट केले आहे: पायथन अपवाद, ट्रेसबॅक; प्रयत्न करा / वगळता / इतर / शेवटी सह अपवाद कसे हाताळायचेब्लॉक, कसे वाढवायचे अपवाद, आणि शेवटी आमचे स्वतःचे सानुकूल अपवाद कसे तयार करायचे.

वाचल्याबद्दल धन्यवाद!

इंटरप्रिटर हे अवैध ऑपरेशन म्हणून पाहतो आणि ZeroDivisionErrorवाढवतो, प्रोग्राममध्ये व्यत्यय आणतो आणि ट्रेसबॅक प्रिंट करतो.

आम्ही स्पष्टपणे पाहू शकतो की ZeroDivisionError हा अपवाद आहे जो उठवला गेला. खरंच पायथनचा स्वतःचा मार्ग आहे की आम्हाला शून्याने विभाजित करणे चांगले नाही. जरी JavaScript सारख्या इतर भाषांमध्ये, ही त्रुटी नाही; आणि पायथन या प्रथेला सक्त मनाई करतो.

तसेच, हे जाणून घेणे महत्त्वाचे आहे की ही केवळ एक अपवाद वस्तू आहे आणि पायथनमध्ये अशा अनेक वस्तू अंतर्भूत आहेत. सर्व Python अंगभूत अपवाद पाहण्यासाठी हे Python अधिकृत दस्तऐवज पहा.

ट्रेसबॅक समजून घेणे

अपवाद हाताळण्याआधी, मला वाटते की अपवाद असल्यास नक्की काय होईल हे समजण्यास मदत होईल. हाताळले जात नाहीत आणि Python आम्हाला आमच्या त्रुटीबद्दल कळवण्याचा सर्वोत्तम प्रयत्न कसा करतो.

जेव्हाही पायथनला एरर येते, तेव्हा तो अपवाद वाढवतो. जर हा अपवाद हाताळला गेला नाही, तर ते ट्रेसबॅक नावाची काही माहिती तयार करते. तर, या ट्रेसबॅकमध्ये कोणती माहिती आहे?

त्यात हे समाविष्ट आहे:

  • कोणता अपवाद उठवला गेला आणि या अपवादापूर्वी काय घडले हे सांगणारा त्रुटी संदेश उठवले.
  • कोडचे विविध ओळ क्रमांक ज्यामुळे ही त्रुटी आली. कॉल स्टॅक नावाच्या फंक्शन कॉलच्या क्रमामुळे एखादी त्रुटी उद्भवू शकते ज्याची आपण नंतर येथे चर्चा करू.

जरी ती एकथोडा गोंधळात टाकणारे, आम्ही वचन देतो की पुढील उदाहरण आमच्या समजूतदारपणात अधिक प्रकाश आणेल.

वरील ५० ने ० विभाजित करून छापलेला ट्रेसबॅक आठवा, आम्ही पाहू शकतो की ट्रेसबॅकमध्ये खालील माहिती आहे:

  • फाइल “”: हे आम्हाला सांगते की हा कोड कन्सोल टर्मिनलवरून चालवला गेला आहे.
  • ओळ 1: हे आम्हाला सांगते की या लाइन नंबरमध्ये त्रुटी आली आहे.
  • झिरो डिव्हिजन एरर: शून्य: ने भागाकार कोणता अपवाद निर्माण झाला आणि तो कशामुळे झाला हे सांगते.

आणखी एक उदाहरण वापरून पहा आणि कदाचित कॉल स्टॅक कसा दिसतो ते पहा. एडिटर उघडा, खालील कोड एंटर करा आणि tracebackExp .py

def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 compute = numb/div # 6 print(compute) # 7 if __name__ == '__main__': # 9 numb = 5 # 10 stack1(numb) # 11 

ज्या डिरेक्टरीमध्ये ही फाईल सापडेल तेथे टर्मिनल उघडा आणि चालवा.

python tracebackExp.py

तुम्हाला खालील ट्रेसबॅक दिसेल:

वरील ट्रेसबॅक गोंधळात टाकणारा वाटू शकतो पण प्रत्यक्षात तसे नाही. पायथॉनिस्टास ट्रेसबॅक वाचण्याचा सर्वोत्तम मार्ग आहे, जो तळाशी आहे. तर, या ट्रेसबॅकने काय ऑफर केले आहे ते समजून घेण्यासाठी या शहाणपणाचा वापर करूया.

  • सर्वात तळाशी, आम्हाला उठवलेला अपवाद आणि तो का उठवला गेला.
  • वर जाताना, आम्हाला फाईलचे नाव मिळते tracebackExp .py जेथे ही त्रुटी आली, ज्या गणनेमुळे ही त्रुटी आली compute = numb/div, फंक्शन stack2 आणि लिंक क्रमांक 6 जेथे ही गणना केली गेली. .
  • वर गेल्यावर आपल्याला स्टॅक2 फंक्शन दिसेलओळ क्रमांक 3 मधील फंक्शन stack1 मध्ये कॉल केला होता.
  • सर्वोच्च वर जाताना, आपण पाहतो की फंक्शन stack1 ला ओळ क्रमांक 11 मध्ये कॉल केला होता. मॉड्यूल > आम्हाला सांगते की ही फाईल कार्यान्वित केली जात आहे.

कॉमन पायथन अपवाद

पायथन लायब्ररी अनेक अंगभूत अपवाद परिभाषित करते. तुम्ही पायथन डॉक्युमेंटेशन तपासू शकता किंवा बिल्ट-इन स्थानिक () फंक्शनला खालीलप्रमाणे कॉल करू शकता:

>>> dir(locals()['__builtins__'])

आम्ही या सर्व अपवादांना संबोधित करण्याचा प्रयत्न करणार नाही, परंतु आम्ही काही सामान्य अपवाद पाहू. जे तुमच्या समोर येण्याची शक्यता आहे.

#1) TypeError

जेव्हा ऑपरेशन किंवा फंक्शन अयोग्य प्रकारच्या ऑब्जेक्टवर लागू केले जाते तेव्हा ते वाढवले ​​जाते.

उदाहरण 1

खालील प्रोग्रामचा विचार करा. हे डिव्हिडंड आणि भाजक घेते, नंतर भागाकाराने डिव्हिडंड विभाजित केल्याचा परिणाम मोजतो आणि मुद्रित करतो.

def compute_division(): dividend = int(input("Enter the dividend: ")) # cast string to int divisor = input("Enter the divisor: ") # no casting # Compute division result = dividend/divisor # print result print("The result of {}/{} is: {}".format(dividend, divisor, result)) if __name__ == '__main__': result = compute_division() 

आम्ही वापरकर्त्याकडून लाभांश आणि विभाजकाच्या मूल्याची विनंती करतो, परंतु आम्ही विभाजकाची स्ट्रिंग टाकण्यास विसरतो. पूर्णांक मध्ये मूल्य. तर, आपण लाभांशाचा प्रकार पूर्णांक ( int ) आणि विभाजकाचा प्रकार स्ट्रिंग ( str ) असा संपतो. नंतर आम्हाला TypeError मिळेल कारण डिव्हिजन ऑपरेटर (/) स्ट्रिंगवर काम करत नाही.

तुम्हाला हे जाणून घेणे आवडेल की पायथनच्या विपरीत, जावास्क्रिप्टमध्ये प्रकार जबरदस्ती आहे जे मुळात ऑपरेंडच्या प्रकारांपैकी एकाचे ऑपरेंडच्या प्रकाराच्या समतुल्य मूल्यामध्ये रूपांतरित करते.भिन्न प्रकार.

#2) ValueError

जेव्हा ऑपरेशन किंवा फंक्शनला योग्य प्रकार परंतु अनुचित मूल्य असलेला युक्तिवाद प्राप्त होतो तेव्हा हे उठवले जाते.

उदाहरण 2

वरील उदाहरण 1 मधील आमच्या प्रोग्रामचा विचार करा.

जर वापरकर्त्याने '3a' सारख्या लाभांशासाठी अल्फान्यूमेरिक मूल्य इनपुट केले, तर आमचा प्रोग्राम वाढेल ValueError अपवाद. याचे कारण असे की, जरी Python int() पद्धत कोणतीही संख्या किंवा स्ट्रिंग घेते आणि पूर्णांक ऑब्जेक्ट देते, तरी स्ट्रिंग व्हॅल्यूमध्ये अक्षरे किंवा कोणतेही नॉन-न्यूमेरिक व्हॅल्यू असू नये.

#3) AttributeError

अस्तित्वात नसलेली विशेषता नियुक्त करताना किंवा संदर्भित करताना हा अपवाद उठवला जातो.

उदाहरण 3

प्रोग्रामचा विचार करा खाली ते संख्या घेते आणि पायथन मॅथ मॉड्यूल वापरून त्याचे वर्गमूळ मोजते

import math # import math library to gain access to its code def compute_square_root(number): # compute the square root using the math library result = math.sqr(number) return result if __name__ == '__main__': # get input to compute from user number = int(input("Compute Square root of: ")) # call function to compute square root 

जेव्हा वापरकर्ता संख्या प्रविष्ट करतो, तेव्हा आमचा प्रोग्राम गणित मॉड्यूलमधून त्याचे वर्गमूळ मोजण्यासाठी फंक्शन वापरण्याचा प्रयत्न करतो परंतु येथे फक्त तेच, आम्ही चूक केली. sqrt च्या ऐवजी, आम्ही चुकून sqr टाइप केला जो math module मध्ये अस्तित्वात नाही.

म्हणून, आम्ही अस्तित्वात नसलेल्या sqr चा संदर्भ देण्याचा प्रयत्न करत होतो. अपवादाने विशेषता एरर उठवली जात आहे. आपल्यापैकी बहुतेक जण अशा प्रकारची चूक खूप करतात. म्हणून, तुम्ही एकटे नाही आहात.

अपवाद वगळता प्रयत्न करून हाताळणे

प्रोग्रामर म्हणून, आपल्यापैकी बहुतेक जण आपला वेळ ज्यावर घालवतील ती म्हणजे एक मजबूत कोड लिहिणेलवचिक कोड जो काही त्रुटींमुळे खंडित होत नाही. पायथनमध्ये, आम्ही आमची विधाने प्रयत्न वगळता स्टेटमेंटमध्ये संलग्न करून हे साध्य करू शकतो.

पायथन ट्राय-एक्झेप्ट स्टेटमेंट

प्रयत्न-वगळता विधानाची खालील रचना आहे:

try: #your code goes here except """Specify exception type(s) here""": #handle exception here 

चला कोड tracebackExp .py मध्ये ट्राय-एक्स्पेप्ट स्टेटमेंटमध्ये संलग्न करू.

def stack1(numb): # 1 div = 0 # 2 stack2(numb, div) # 3 def stack2(numb, div): # 5 try: # 6 compute = numb/div # 7 print(compute) # 8 except ZeroDivisionError as zde: # 9 print(zde) # 10 if __name__ == '__main__': # 12 numb = 5 # 13 stack1(numb) # 14 print("program continuous") # 15 

हा कोड चालवल्याने आउटपुट तयार होईल

अशा प्रकारे प्रयत्न-वगळता विधान कार्य करते. पायथन ट्राय ब्लॉक लाइन 7-8 मध्ये कोड कार्यान्वित करतो. जर कोणताही अवैध कोड आढळला नाही, तर ब्लॉक लाइन 10 वगळता कोड वगळला जातो आणि अंमलबजावणी सुरू राहते.

परंतु, जर अवैध कोड आढळला तर, अंमलबजावणी ताबडतोब थांबते. अवरोधित करण्याचा प्रयत्न करा आणि अपवाद विधान ओळ 9 मध्ये दिलेल्या अपवादाशी जुळतो का ते तपासा. जर ते जुळत असेल, तर अपवाद वगळता ब्लॉक कार्यान्वित केला जाईल आणि सुरू राहील. तसे न झाल्यास, कार्यक्रमात व्यत्यय येईल.

ट्राय-ब्लॉकमध्ये सहसा असा कोड असतो जो अपवाद वाढवतो तर अपवाद-ब्लॉक अपवाद पकडतो आणि हाताळतो.

एकाधिक हाताळणी अपवाद वगळता

आम्ही एकतर "वगळून" किंवा एकाधिक "वगळता" सह अनेक अपवाद हाताळू शकतो. हे सर्व तुम्ही प्रत्येक अपवाद कसे हाताळू इच्छिता यावर अवलंबून आहे.

#1) एका अपवादासह एकाधिक अपवाद हाताळणे

try: #your code goes here except(Exception1[, Exception2[,...ExceptionN]]]): #handle exception here 

आमचा कोड असू शकतो अशी शंका आल्यावर ही पद्धत वापरली जातेभिन्न अपवाद वाढवा आणि आम्हाला प्रत्येक बाबतीत समान कारवाई करायची आहे. तर, जर पायथन इंटरप्रिटरला एक जुळणी आढळली, तर अपवाद वगळता ब्लॉकमध्ये लिहिलेला कोड कार्यान्वित होईल.

खालील पायथन कोडचा विचार करूया

def get_fraction(value, idx): arr = [4,5,2,0] # a list of numbers idx_value = arr[idx] # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 3 # call function in a try-except statement. try: result = get_fraction(value, idx) print("Fraction is ", result) except (IndexError, ZeroDivisionError) as ex: print(ex) 

आपल्याकडे दोन आहेत संभाव्य अपवाद जे येथे उभे केले जाऊ शकतात, ZeroDivisionError आणि IndexError . यापैकी कोणताही अपवाद वाढल्यास, अपवाद वगळता ब्लॉक कार्यान्वित केला जाईल.

वरील कोडमध्ये, idx=3, म्हणून idx_ मूल्य 0 आणि मूल्य होईल. /idx_ value ZeroDivisionError वाढवेल

#2) एकाधिक अपवादांसह एकाधिक अपवाद हाताळणे

try: #your code goes here except Exception1: #handle exception1 here except Exception2: #handle exception2 here except ExceptionN: #handle exceptionN here 

आपण त्याऐवजी हाताळू इच्छित असल्यास प्रत्येक अपवाद स्वतंत्रपणे, नंतर तुम्ही हे कसे करू शकता.

खालील पायथन कोडचे उदाहरण विचारात घ्या

def get_fraction(value, idx): arr = [4,5,2,0] # a list of numbers idx_value = arr[idx] # if idx is > arr length, IndexError will be raised value/idx_value # if idx_value == 0, ZeroDivisionError will be raised if __name__ =='__main__': # set 'value' and 'idx' value = 54 idx = 5 # call function in a try-excepts statement. try: result = get_fraction(value, idx) print("Fraction is ", result) except IndexError: print("idx of {} is out of range".format(idx)) except ZeroDivisionError: print("arr[{}] is 0. Hence, can't divide by zero".format(idx)) except Exception as ex: print(ex) print("Not sure what happened so not safe to continue, \ app will be interrupted") raise ex 

आम्ही येथे लक्षात घेतले की अपवाद शेवटच्या अपवाद विधानात वापरला गेला होता. . कारण अपवाद ऑब्जेक्ट अपवाद कोणत्याही अपवादाशी जुळतो. या कारणास्तव, ते नेहमी शेवटचे असले पाहिजे, कारण एक जुळल्यानंतर पायथन इतर अपवाद हँडलर तपासणे थांबवेल.

वरील कोडमध्ये, idx=5 , म्हणून arr[idx ] वाढवेल IndexError कारण idx यादीच्या लांबीपेक्षा जास्त आहे arr

तसेच, तुमच्या अर्जाद्वारे कोणता अपवाद उपस्थित केला गेला याची खात्री नाही, अंमलबजावणी सुरू ठेवण्यासाठी कधीही सुरक्षित नाही. म्हणूनच कोणतेही अनपेक्षित अपवाद पकडण्यासाठी आमच्याकडे अपवाद हा प्रकार आहे. मग, आम्ही माहिती देतोवापरकर्ता आणि समान अपवाद वाढवून अनुप्रयोगात व्यत्यय आणा.

इतर विधान वापरून पहा

हे अपवाद हाताळणीचे वैकल्पिक वैशिष्ट्य आहे आणि तुम्हाला कोड जोडण्याची परवानगी देते. कोणतीही त्रुटी आढळली नाही तेव्हा चालवा. त्रुटी आढळल्यास, हा else-ब्लॉक चालणार नाही.

खालील Python कोडचे उदाहरण विचारात घ्या, तुमचा एडिटर उघडा आणि कोड elseTry.py

def fraction_of_one(divisor): value = 1/divisor # if divisor is zero, ZeroDivisionError will be raised return value if __name__ == '__main__': while True: try: # Get input from the user. # if input is not a valid argument for int(), ValueError will be raised divisor = int(input("Enter a divisor: ")) # call our function to compute the fraction value = fraction_of_one(divisor) except (ValueError, ZeroDivisionError): print("Input can't be zero and should be a valid literal for int(). Please, try again!") else: print("Value: ", value) break 
0 म्हणून सेव्ह करा>आम्हाला वापरकर्त्याकडून इनपुट मिळतात आणि ते 1 विभाजित करण्यासाठी वापरतात. आमच्याकडे येथे दोन संभाव्य अपवाद आहेत, एक अवैध वापरकर्ता इनपुट ज्यामुळे ValueErrorआणि शून्य(0)होईल. झिरो डिव्हिजन एरर. आमचे वगळता विधान या त्रुटी हाताळते.

आता, आम्हाला value चे मूल्य मुद्रित करायचे आहे. आमचे इतर-ब्लॉक हे सुनिश्चित करते की आमचा प्रयत्न ब्लॉक त्रुटीशिवाय कार्यान्वित झाला तरच ते छापले जाईल. हे महत्त्वाचे आहे कारण आमच्या ट्राय-ब्लॉकमध्ये त्रुटी आढळल्यास, मूल्य अपरिभाषित असेल. त्यामुळे, त्यात प्रवेश केल्याने आणखी एक त्रुटी निर्माण होईल.

वरील कोड Python elseTry.py सह चालवा

वरील आउटपुट दर्शवते की पहिल्या इनपुटसाठी, आम्ही 0 टाइप केले आणि ENTER दाबले. आमच्या विभाजकाने 0 प्राप्त केल्यामुळे, 1/विभाजकाने zeroDivisionError वाढवले. आमचा दुसरा इनपुट k होता जो int () साठी अवैध आहे, म्हणून अपवाद ValueError वाढवला आहे.

पण आमचे शेवटचे इनपुट 9 होते जे वैध आहे आणि a म्हणून परिणामी, आम्हाला 0.111111111111111

शेवटी प्रयत्न करून " value " चे मूल्य मिळालेविधान

हे अपवाद हाताळणीचे वैकल्पिक वैशिष्ट्य देखील आहे आणि अपवाद हँडलरमध्ये काहीही झाले तरी ते नेहमी चालेल.

म्हणजे:

  • अपवाद येतो की नाही
  • इतर ब्लॉक्समध्ये 'रिटर्न' कॉल केला असला तरीही.
  • इतर ब्लॉक्समध्ये स्क्रिप्ट सोडली असली तरीही

म्हणून, जर आमच्याकडे कोड असेल जो आम्हाला सर्व परिस्थितीत चालवायचा आहे, शेवटी-ब्लॉक हा आमचा माणूस आहे. हा ब्लॉक बहुतेक क्लीन-अपसाठी वापरला जातो जसे की फाईल्स बंद करणे.

खालील पायथन कोडचे उदाहरण विचारात घ्या

def readFile(file_path): try: openFile = open(file_path,'r') # Open a file as read-only print(openFile.readline()) # Read first line of file content except FileNotFoundError as ex: print(ex) finally: print("Cleaning...") openFile.close() if __name__ == '__main__': filePath = './text.txt' readFile(filePath) 

हा कोड टेक्स्ट.txt फाइल उघडण्याचा आणि वाचण्याचा प्रयत्न करतो. त्याच्या वर्तमान निर्देशिकेत. जर फाइल अस्तित्वात असेल, तर आमचा प्रोग्राम फाइलची पहिली ओळ मुद्रित करेल, त्यानंतर आमचा अंतिम-ब्लॉक रन होईल आणि फाइल बंद करेल.

म्हणजे आमच्याकडे ही प्रोग्राम फाइल असलेल्या डिरेक्टरीमध्ये text.txt नावाची फाइल आहे. हॅलो आहे आणि त्यात समाविष्ट आहे. आम्ही प्रोग्राम चालवल्यास, आमच्याकडे आउटपुट असेल

हे उदाहरण जाणूनबुजून निवडले आहे कारण शेवटी फाइल्स बंद करताना उद्भवू शकणार्‍या एका छोट्या समस्येचे निराकरण करावे अशी माझी इच्छा होती- ब्लॉक करा.

फाइल अस्तित्वात नसल्यास, अपवाद FileNotFoundError वाढवला जाईल आणि व्हेरिएबल openFile परिभाषित केले जाणार नाही आणि फाइल नसेल. वस्तू म्हणून, शेवटी-ब्लॉकमध्ये ते बंद करण्याचा प्रयत्न केल्यास अपवाद UnboundLocalError वाढेल जो NameError चा उपवर्ग आहे.

हे मुळात असे म्हणते की आम्ही संदर्भ देण्याचा प्रयत्न करत आहोत. द

वरील स्क्रॉल करा