MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

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ă.