try / except / else / finally în Python

Erori și excepții Python 3.0+

Prinde și tratează erorile (excepțiile), ca programul să nu se oprească brusc.

Sintaxă
try:
    ...
except TipEroare as e:
    ...
else:
    ...
finally:
    ...

Ce face try / except / else / finally

Codul care poate da eroare se pune în blocul try. Dacă apare o excepție, Python sare la primul bloc except potrivit tipului ei. Cu as e primești obiectul excepției, cu mesajul erorii.

Blocul else rulează doar dacă în try nu a apărut nicio eroare. Blocul finally rulează mereu, cu sau fără eroare, și este locul pentru curățenie (închiderea unei conexiuni, ștergerea unui fișier temporar).

Prinde doar erorile la care te aștepți (ValueError, KeyError, FileNotFoundError…). Un except: gol sau except Exception ascunde și greșelile de programare.

Exemple

Exemplul 1: Conversie sigură

for text in ["42", "abc", "7"]:
    try:
        numar = int(text)
    except ValueError:
        print(f"„{text}” nu este număr")
    else:
        print("Numărul dublat:", numar * 2)

Rezultat

Numărul dublat: 84
„abc” nu este număr
Numărul dublat: 14

Exemplul 2: Mai multe tipuri de erori

def imparte(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        return "împărțire la zero"
    except TypeError as e:
        return f"tip greșit: {e}"

print(imparte(10, 4))
print(imparte(10, 0))
print(imparte(10, "2"))

Rezultat

2.5
împărțire la zero
tip greșit: unsupported operand type(s) for /: 'int' and 'str'

Exemplul 3: finally rulează mereu

def citeste(cheie):
    date = {"nume": "Ana"}
    try:
        return date[cheie]
    except KeyError:
        return "cheie lipsă"
    finally:
        print(f"(căutare terminată pentru {cheie!r})")

print(citeste("nume"))
print(citeste("oras"))

Rezultat

(căutare terminată pentru 'nume')
Ana
(căutare terminată pentru 'oras')
cheie lipsă

Greșeli frecvente

  • Scrii except: fără tip. Prinzi orice, inclusiv Ctrl+C (KeyboardInterrupt), și greșelile de scriere rămân ascunse.
  • Pui prea mult cod în try. Păstrează în el doar rândul care poate da eroarea așteptată; restul merge în else.

Comenzi înrudite

  • raise: Aruncă (semnalează) o excepție, oprind execuția normală până când este prinsă cu except.
  • assert: Verifică o condiție care trebuie să fie adevărată; dacă nu este, oprește programul cu AssertionError.
  • open() și with: Deschide un fișier pentru citire sau scriere; cu with, fișierul este închis automat.