Ce face raise
Cu raise semnalezi că ceva nu este în regulă: o valoare invalidă, o resursă lipsă. Alegi tipul potrivit (ValueError pentru o valoare greșită, TypeError pentru un tip greșit, KeyError, FileNotFoundError…) și dai un mesaj clar.
Un raise simplu, fără argument, în interiorul unui except, aruncă din nou excepția prinsă. Cu raise NouaEroare(...) from e păstrezi eroarea originală drept cauză. Excepțiile proprii se definesc ca subclase ale lui Exception.
Exemple
Exemplul 1: Validarea unui argument
def seteaza_varsta(varsta):
if not isinstance(varsta, int):
raise TypeError("Vârsta trebuie să fie un număr întreg")
if varsta < 0:
raise ValueError(f"Vârstă invalidă: {varsta}")
return varsta
for v in [25, -3, "20"]:
try:
print("OK:", seteaza_varsta(v))
except (TypeError, ValueError) as e:
print(type(e).__name__, "-", e)
Rezultat
OK: 25
ValueError - Vârstă invalidă: -3
TypeError - Vârsta trebuie să fie un număr întreg
Exemplul 2: Excepție proprie și from
class StocInsuficient(Exception):
pass
stoc = {"mere": 5}
def vinde(produs, cantitate):
try:
disponibil = stoc[produs]
except KeyError as e:
raise StocInsuficient(f"Produs necunoscut: {produs}") from e
if cantitate > disponibil:
raise StocInsuficient(f"Doar {disponibil} kg de {produs}")
stoc[produs] -= cantitate
for comanda in [("mere", 3), ("mere", 4), ("pere", 1)]:
try:
vinde(*comanda)
print("Vândut:", comanda)
except StocInsuficient as e:
print("Eroare:", e, "| cauza:", repr(e.__cause__))
Rezultat
Vândut: ('mere', 3)
Eroare: Doar 2 kg de mere | cauza: None
Eroare: Produs necunoscut: pere | cauza: KeyError('pere')
Greșeli frecvente
- Arunci
Exception("...")generic. Cine prinde eroarea nu o poate deosebi de altele; folosește un tip specific sau o excepție proprie. - Scrii
raise "mesaj". În Python 3 poți arunca doar excepții:TypeError: exceptions must derive from BaseException.
Comenzi înrudite
try / except / else / finally: Prinde și tratează erorile (excepțiile), ca programul să nu se oprească brusc.assert: Verifică o condiție care trebuie să fie adevărată; dacă nu este, oprește programul cu AssertionError.class: Definește o clasă: un șablon pentru obiecte care au date (atribute) și comportament (metode).