În programarea asincronă și distribuită (cum ar fi rularea mai multor corutine paralele în asyncio.TaskGroup), se poate întâmpla ca mai multe erori distincte să apară simultan pe fire diferite de execuție. Tradițional, Python putea propaga o singură excepție la un moment dat, pierzând celelalte erori. Începând cu Python 3.11 (PEP 654), a fost introdus tipul nativ ExceptionGroup și noua clauză sintactică except* (except-star).
# Un ExceptionGroup conține o colecție de excepții individuale apărute simultan:
erori = [
ValueError("Preț negativ invalid!"),
TypeError("Numele clientului trebuie să fie string!"),
ValueError("Cod poștal incorect!")
]
grup = ExceptionGroup("Erori de validare comandă", erori)
# NOU ÎN PYTHON 3.11+: Clauza except* (cu asterisc)
try:
raise grup
except* ValueError as eg:
# eg este un sub-grup care conține EXCLUSIV erorile de tip ValueError:
print(f"Am prins {len(eg.exceptions)} erori de valoare:")
for e in eg.exceptions:
print(f" - {e}")
except* TypeError as eg:
# Acest bloc se execută DE ASEMENEA în cadrul aceleiași instrucțiuni try!
print("Am prins erorile de tip:", eg.exceptions)
Diferența Critică între except și except*
| Caracteristică | Clauza Tradițională except | Noua Clauză except* |
|---|---|---|
| Număr de ramuri executate | Se execută exact o singură ramură potrivită (prima care corespunde). | Se pot executa mai multe ramuri succesive, fiecare procesând subtipul său de erori din grup! |
| Erori netratate | Dacă excepția nu corespunde, este repropagată integral. | Erorile rămase neprinse de nicio ramură except* sunt reîmpachetate automat într-un nou ExceptionGroup și repropagate! |
Adăugarea Notițelor de Context cu add_note()
O altă noutate utilă din Python 3.11 este metoda add_note() disponibilă pe clasa de bază BaseException. Aceasta permite atașarea de informații contextuale de depanare la orice eroare fără a altera mesajul original și fără a distruge traceback-ul:
try:
proceseaza_plata(id_cont=4512)
except Exception as err:
# Atașăm notițe utile pentru logurile de producție Sentry / DataDog:
err.add_note(f"Server Hostname: api-worker-03")
err.add_note(f"Timestamp tranzacție: 2026-10-24 18:00:00")
raise # Traceback-ul afișat va include automat toate notițele adăugate!