Grupuri de Excepții (ExceptionGroup) și Clauza except* în Python 3.11+ în Python

Ghid complet pentru tratarea erorilor concurente în Python 3.11+: clasa ExceptionGroup, sintaxa except* pentru prinderea paralelă pe tipuri și îmbogățirea erorilor cu add_note().

Sintaxă
try:
    ...
except* ValueError as eg:
    ...
err.add_note('Context: ID comanda = 55');

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

Structura unui ExceptionGroup și prinderea cu except*
# 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:

Îmbogățirea excepțiilor cu metadate de context
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!
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Grupuri de Excepții (ExceptionGroup) și Clauza except* în Python 3.11+

Ai o nelămurire despre utilizarea comenzii Grupuri de Excepții (ExceptionGroup) și Clauza except* în Python 3.11+ sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.