Generarea excepțiilor și crearea propriilor tipuri de excepții
Generarea excepțiilor și operatorul raise
Uneori, apare necesitatea de a genera manual o anumită excepție. Pentru aceasta se utilizează operatorul raise. De exemplu, să generăm o excepție:
try:
age = int(input("Introduceți vârsta: "))
if age > 110 or age < 1:
raise Exception("Vârstă incorectă")
print("Vârsta dvs.:", age)
except ValueError:
print("Date introduse incorect")
except Exception as e:
print(e)
print("Finalizarea programului")
Operatorului raise i se transmite un obiect de tip BaseException, în acest caz, un obiect de tip Exception. În constructorul acestui tip se poate transmite un mesaj, care apoi poate fi afișat utilizatorului. Astfel, dacă age va fi mai mare de 110 sau mai mic de 1, operatorul raise va genera o excepție. În consecință, controlul programului va trece la blocul except, care gestionează excepțiile de tip Exception:
Introduceți vârsta: 100500
Vârstă incorectă
Finalizarea programului
Crearea propriilor tipuri de excepții
În Python, nu suntem limitați doar la tipurile de excepții încorporate și putem, prin utilizarea moștenirii, să creăm propriile noastre tipuri de excepții atunci când este necesar. De exemplu, să considerăm următoarea clasă Person:
class Person:
def __init__(self, name, age):
self.__name = name # setăm numele
self.__age = age # setăm vârsta
def display_info(self):
print(f"Nume: {self.__name} Vârstă: {self.__age}")
În această clasă Person, constructorul primește valorile pentru nume și vârstă și le atribuie variabilelor private name și age. Cu toate acestea, la crearea unui obiect Person, putem transmite constructorului o valoare incorectă din punct de vedere logic - de exemplu, un număr negativ. O soluție pentru această situație este generarea unei excepții atunci când se transmit valori incorecte.
Să definim următorul cod al programului:
class PersonAgeException(Exception):
def __init__(self, age, minage, maxage):
self.age = age
self.minage = minage
self.maxage = maxage
def __str__(self):
return f"Valoare nepermisă: {self.age}. " \
f"Vârsta trebuie să fie în intervalul de la {self.minage} până la {self.maxage}"
class Person:
def __init__(self, name, age):
self.__name = name # setăm numele
minage, maxage = 1, 110
if minage < age < maxage: # setăm vârsta dacă valoarea este corectă
self.__age = age
else: # în caz contrar, generăm o excepție
raise PersonAgeException(age, minage, maxage)
def display_info(self):
print(f"Nume: {self.__name} Vârstă: {self.__age}")
try:
tom = Person("Tom", 37)
tom.display_info() # Nume: Tom Vârstă: 37
bob = Person("Bob", -23)
bob.display_info()
except PersonAgeException as e:
print(e) # Valoare nepermisă: -23. Vârsta trebuie să fie în intervalul de la 1 până la 110
În acest exemplu, mai întâi este definită clasa PersonAgeException, care este derivată din clasa Exception. De regulă, propriile clase de excepții sunt derivate din clasa Exception. Clasa PersonAgeException este destinată excepțiilor legate de vârsta utilizatorului.
În constructorul PersonAgeException, se primesc trei valori: valoarea incorectă care a cauzat excepția, precum și valorile minimă și maximă ale vârstei.
class PersonAgeException(Exception):
def __init__(self, age, minage, maxage):
self.age = age
self.minage = minage
self.maxage = maxage
def __str__(self):
return f"Valoare nepermisă: {self.age}. " \
f"Vârsta trebuie să fie în intervalul de la {self.minage} până la {self.maxage}"
În funcția __str__, definim reprezentarea textuală a clasei - practic un mesaj de eroare.
În constructorul clasei Person, verificăm valoarea transmisă pentru vârsta utilizatorului. Dacă această valoare nu se încadrează în intervalul definit, generăm o excepție de tip PersonAgeException:
raise PersonAgeException(age, minage, maxage)
La utilizarea clasei Person, trebuie să avem în vedere că constructorul clasei poate genera o excepție atunci când se transmite o valoare incorectă. Prin urmare, crearea obiectelor Person este încadrată într-o construcție try..except:
try:
tom = Person("Tom", 37)
tom.display_info() # Nume: Tom Vârstă: 37
bob = Person("Bob", -23) # se generează o excepție de tip PersonAgeException
bob.display_info()
except PersonAgeException as e:
print(e) # Valoare nepermisă: -23. Vârsta trebuie să fie în intervalul de la 1 până la 110
Dacă la apelarea constructorului Person se va genera o excepție de tip PersonAgeException, controlul programului va trece la blocul except, care gestionează excepțiile de tip PersonAgeException, afișând informațiile despre excepție pe consolă.