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 înelse.
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.