Except și gestionarea diferitelor tipuri de excepții
Tipuri de excepții încorporate
În exemplul de mai sus, toate excepțiile care ar putea apărea în cod au fost gestionate simultan. Cu toate acestea, putem specifica tipul de excepție pe care dorim să-l gestionăm, indicându-l după cuvântul except:
try:
number = int(input("Introduceți un număr: "))
print("Numărul introdus:", number)
except ValueError:
print("Conversia a eșuat")
print("Finalizarea programului")
În acest caz, blocul except gestionează doar excepțiile de tip ValueError, care pot apărea în urma unei conversii nereușite a șirului într-un număr.
Tipuri de excepții de bază în Python:
- BaseException: tip de bază pentru toate excepțiile încorporate.
- Exception: tip de bază, utilizat de obicei pentru crearea propriilor tipuri de excepții.
- ArithmeticError: tip de bază pentru excepțiile legate de operațiile aritmetice (de exemplu, OverflowError, ZeroDivisionError, FloatingPointError).
- BufferError: excepție care apare atunci când nu se poate efectua o operațiune cu bufferul.
- LookupError: tip de bază pentru excepțiile care apar atunci când se face referire la un element dintr-o colecție folosind o cheie sau un index incorect (de exemplu, IndexError, KeyError).
Toate tipurile specifice de excepții sunt derivate din aceste clase de bază.
Python are o listă extinsă de excepții încorporate. Iată câteva dintre cele mai frecvent întâlnite:
- IndexError: apare atunci când indexul folosit pentru accesarea unui element dintr-o colecție este în afara intervalului permis.
- KeyError: apare atunci când o cheie nu este prezentă în dicționar.
- OverflowError: apare atunci când rezultatul unei operații aritmetice nu poate fi reprezentat de tipul numeric curent (de obicei tipul float).
- RecursionError: apare atunci când se depășește adâncimea permisă a recursiei.
- TypeError: apare atunci când o operație sau o funcție este aplicată unei valori de tip incorect.
- ValueError: apare atunci când o operație sau o funcție primește un obiect de tip corect, dar cu o valoare incorectă.
- ZeroDivisionError: apare la împărțirea la zero.
- NotImplementedError: indică faptul că anumite metode ale unei clase nu sunt implementate.
- ModuleNotFoundError: apare atunci când nu se găsește un modul la importul său.
- OSError: tip de excepție generată de erori de sistem (de exemplu, când nu se poate găsi un fișier, memoria discului este plină etc.).
Dacă programul poate genera mai multe tipuri de excepții, le putem gestiona separat, folosind expresii except suplimentare. Când apare o excepție, Python va căuta blocul except corespunzător care gestionează tipul respectiv de excepție:
try:
number1 = int(input("Introduceți primul număr: "))
number2 = int(input("Introduceți al doilea număr: "))
print("Rezultatul împărțirii:", number1 / number2)
except ValueError:
print("Conversia a eșuat")
except ZeroDivisionError:
print("Împărțire la zero")
except BaseException:
print("Excepție generală")
print("Finalizarea programului")
Dacă apare o excepție în urma conversiei șirului într-un număr, aceasta va fi gestionată de blocul except ValueError. Dacă al doilea număr este zero, adică dacă se încearcă împărțirea la zero, va apărea o excepție ZeroDivisionError, care va fi gestionată de blocul except ZeroDivisionError.
Tipul BaseException reprezintă o excepție generală, sub care intră toate situațiile excepționale. Astfel, în exemplul de mai sus, orice excepție care nu este de tip ValueError sau ZeroDivisionError va fi gestionată de blocul except BaseException.
Totuși, dacă în program apare o excepție pentru care nu există un bloc except corespunzător, programul nu va găsi un bloc except adecvat și va genera o excepție. De exemplu:
try:
number1 = int(input("Introduceți primul număr: "))
number2 = int(input("Introduceți al doilea număr: "))
print("Rezultatul împărțirii:", number1 / number2)
except ZeroDivisionError:
print("Împărțire la zero")
print("Finalizarea programului")
Aici este prevăzută gestionarea împărțirii la zero cu ajutorul blocului except ZeroDivisionError. Totuși, dacă utilizatorul introduce în loc de număr un șir care nu poate fi convertit într-un număr, va apărea o excepție de tip ValueError, pentru care nu există un bloc except corespunzător. Prin urmare, programul se va încheia brusc.
Python permite gestionarea mai multor tipuri de excepții într-un singur bloc except. În acest caz, toate tipurile de excepții sunt indicate între paranteze:
try:
number1 = int(input("Introduceți primul număr: "))
number2 = int(input("Introduceți al doilea număr: "))
print("Rezultatul împărțirii:", number1 / number2)
except (ZeroDivisionError, ValueError): # gestionarea a două tipuri de excepții - ZeroDivisionError și ValueError
print("Împărțire la zero sau introducere incorectă")
print("Finalizarea programului")
Obținerea informațiilor despre excepții.
Cu ajutorul operatorului as, putem transmite toate informațiile despre excepție într-o variabilă, pe care apoi o putem folosi în blocul except:
try:
number = int(input("Introduceți un număr: "))
print("Numărul introdus:", number)
except ValueError as e:
print("Informații despre excepție:", e)
print("Finalizarea programului")
Exemplu de introducere incorectă:
Introduceți un număr: fdsf
Informații despre excepție: invalid literal for int() with base 10: 'fdsf'
Finalizarea programului