raise în Python

Erori și excepții Python 3.0+

Aruncă (semnalează) o excepție, oprind execuția normală până când este prinsă cu except.

Sintaxă
raise TipEroare("mesaj")
raise TipEroare("mesaj") from cauza

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