În acest tutorial, veți învăța cum să gestionați excepțiile din programul Python folosind instrucțiunile try, except și în cele din urmă cu ajutorul exemplelor.
Video: Python Exception Handling (încercați … cu excepția … în cele din urmă)
Excepții în Python
Python are multe excepții încorporate care sunt ridicate atunci când programul dvs. întâmpină o eroare (ceva din program nu merge bine).
Când apar aceste excepții, interpretul Python oprește procesul curent și îl transmite procesului de apelare până când este tratat. Dacă nu este tratat, programul se va prăbuși.
De exemplu, să luăm în considerare un program în care avem o funcție A
care apelează funcția B
, care la rândul său apelează funcția C
. Dacă apare o excepție în funcție, C
dar nu este tratată C
, excepția trece la B
și apoi la A
.
Dacă nu este tratat niciodată, se afișează un mesaj de eroare și programul nostru se oprește brusc neașteptat.
Prinderea excepțiilor în Python
În Python, excepțiile pot fi gestionate folosind o try
instrucțiune.
Operația critică care poate ridica o excepție este plasată în try
clauză. Codul care gestionează excepțiile este scris în except
clauză.
Putem alege astfel ce operațiuni să efectuăm odată ce am prins excepția. Iată un exemplu simplu.
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()(0), "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Ieșire
Intrarea este un Hopa! a avut loc. Următoarea intrare. Intrarea este 0 Hopa! s-a produs. Următoarea intrare. Intrarea este 2 Reciprocul de 2 este 0,5
În acest program, vom parcurge valorile listei randomList. După cum sa menționat anterior, porțiunea care poate provoca o excepție este plasată în interiorul try
blocului.
Dacă nu apare nicio excepție, except
blocul este omis și fluxul normal continuă (pentru ultima valoare). Dar dacă apare o excepție, aceasta este prinsă de except
bloc (prima și a doua valoare).
Aici, imprimăm numele excepției folosind exc_info()
funcția din interiorul sys
modulului. Putem vedea că a
cauzele ValueError
și 0
cauzele ZeroDivisionError
.
Deoarece fiecare excepție din Python moștenește din Exception
clasa de bază , putem efectua și sarcina de mai sus în felul următor:
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Acest program are aceeași ieșire ca programul de mai sus.
Prinderea excepțiilor specifice în Python
În exemplul de mai sus, nu am menționat nicio excepție specifică în except
clauză.
Aceasta nu este o practică bună de programare, deoarece va prinde toate excepțiile și va gestiona fiecare caz în același mod. Putem specifica ce excepții except
ar trebui să includă o clauză.
O try
clauză poate avea orice număr de except
clauze pentru a gestiona diferite excepții, cu toate acestea, doar una va fi executată în cazul în care apare o excepție.
Putem folosi un tuplu de valori pentru a specifica mai multe excepții într-o clauză exceptată. Iată un exemplu de pseudo-cod.
try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass
Creșterea excepțiilor în Python
În programarea Python, excepțiile sunt ridicate atunci când apar erori în timpul rulării. De asemenea, putem ridica manual excepții folosind raise
cuvântul cheie.
Opțional, putem transmite valori excepției pentru a clarifica de ce a fost ridicată acea excepție.
>>> raise KeyboardInterrupt Traceback (most recent call last):… KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last):… MemoryError: This is an argument >>> try:… a = int(input("Enter a positive integer: "))… if a <= 0:… raise ValueError("That is not a positive number!")… except ValueError as ve:… print(ve)… Enter a positive integer: -2 That is not a positive number!
Python încearcă cu clauza else
În unele situații, este posibil să doriți să rulați un anumit bloc de cod dacă blocul de cod din interior a try
rulat fără erori. Pentru aceste cazuri, puteți utiliza else
cuvântul cheie opțional cu try
declarația.
Notă : excepțiile din clauza else nu sunt tratate de cele precedente cu excepția clauzelor.
Să vedem un exemplu:
# program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)
Ieșire
Dacă trecem un număr impar:
Introduceți un număr: 1 Nu este un număr par!
Dacă trecem un număr par, reciprocul este calculat și afișat.
Introduceți un număr: 4 0,25
Cu toate acestea, dacă trecem 0, obținem ZeroDivisionError
deoarece blocul de cod din interior else
nu este gestionat de precedent except
.
Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero
Python try… finally
The try
statement in Python can have an optional finally
clause. This clause is executed no matter what, and is generally used to release external resources.
For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).
In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally
clause to guarantee the execution.
Here is an example of file operations to illustrate this.
try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()
Acest tip de construcție asigură faptul că fișierul este închis chiar dacă apare o excepție în timpul execuției programului.