Giriş: Python'da Yeni Bir Hata Yönetimi Yaklaşımı

Python 3.11 ile birlikte gelen BaseExceptionGroup, modern Python programlamada hata yönetimini kökten değiştiren bir özellik olarak karşımıza çıkıyor. Bu makalede:

✔ BaseExceptionGroup nedir ve neden ihtiyaç duyuldu?
✔ ExceptionGroup ile farkları
✔ Pratik kullanım senaryoları
✔ Gelişmiş hata yakalama teknikleri
✔ Performans optimizasyonları

konularını derinlemesine inceleyeceğiz.

1. BaseExceptionGroup Nedir?

BaseExceptionGroup, Python 3.11'de tanıtılan ve birden fazla istisnayı tek bir yapıda gruplamaya olanak tanıyan bir sınıftır. Bu yapı, özellikle eşzamanlı (concurrent) programlarda ve karmaşık iş akışlarında ortaya çıkan çoklu hataları yönetmek için tasarlanmıştır.

python
Copy
Download
try:
    raise BaseExceptionGroup(
        "Çoklu hatalar",
        [ValueError("Geçersiz değer"), TypeError("Yanlış tip")]
    )
except BaseExceptionGroup as eg:
    print(f"{len(eg.exceptions)} hata yakalandı")

Temel Özellikler:

  • Birden fazla istisnayı tek nesnede gruplar

  • Hem BaseException hem de Exception türündeki hataları içerebilir

  • Hiyerarşik hata yapıları oluşturmaya imkan verir

2. BaseExceptionGroup vs ExceptionGroup

Python'da iki tür grup istisna bulunur:

ÖzellikBaseExceptionGroupExceptionGroup
KapsamTüm istisna türleriSadece Exception'dan türeyenler
Kullanım AlanıSistem seviyesi hatalarUygulama seviyesi hatalar
Örnek KullanımKeyboardInterrupt + SystemExitValueError + TypeError
python
Copy
Download
# ExceptionGroup örneği
eg = ExceptionGroup(
    "Uygulama hataları",
    [ValueError("Geçersiz giriş"), KeyError("Anahtar bulunamadı")]
)

# BaseExceptionGroup örneği
beg = BaseExceptionGroup(
    "Kritik hatalar",
    [KeyboardInterrupt(), SystemExit()]
)

3. Temel Kullanım Senaryoları

a) Eşzamanlı İşlemlerde Hata Yönetimi

Asenkron programlamada BaseExceptionGroup özellikle kullanışlıdır:

python
Copy
Download
import asyncio

async def task1():
    raise ValueError("Task 1 hatası")

async def task2():
    raise TypeError("Task 2 hatası")

async def main():
    try:
        await asyncio.gather(task1(), task2())
    except BaseExceptionGroup as eg:
        print(f"Toplam {len(eg.exceptions)} hata:")
        for exc in eg.exceptions:
            print(f"- {type(exc).__name__}: {exc}")

asyncio.run(main())

b) Hiyerarşik Hata Yapıları

Gruplar iç içe geçebilir, karmaşık hata yapıları oluşturulabilir:

python
Copy
Download
nested_group = BaseExceptionGroup(
    "Kök hatalar",
    [
        ExceptionGroup(
            "Veritabanı hataları",
            [ConnectionError(), TimeoutError()]
        ),
        ExceptionGroup(
            "Ağ hataları",
            [OSError("Bağlantı kesildi")]
        )
    ]
)

4. Gelişmiş Hata Yakalama Teknikleri

a) Belirli Hata Türlerini Yakalama

except* sözdizimi ile gruplanmış hataları türlerine göre ayırabiliriz:

python
Copy
Download
try:
    raise ExceptionGroup(
        "Çeşitli hatalar",
        [ValueError(), TypeError(), OSError()]
    )
except* ValueError as ve:
    print(f"ValueError yakalandı: {ve}")
except* TypeError as te:
    print(f"TypeError yakalandı: {te}")
except* OSError as oe:
    print(f"OSError yakalandı: {oe}")

b) Hataları Filtreleme ve Yeniden Yapılandırma

python
Copy
Download
def handle_errors(group):
    match group:
        case ExceptionGroup("Veritabanı", _):
            print("Veritabanı hataları işlendi")
        case ExceptionGroup("Ağ", _):
            print("Ağ hataları işlendi")
        case _:
            print("Diğer hatalar")

handle_errors(nested_group)

5. Performans Optimizasyonları

a) Büyük Hata Gruplarını Yönetme

Çok sayıda istisna içeren gruplar için:

python
Copy
Download
# Verimli iterasyon
for exc in eg.exceptions:
    if isinstance(exc, ValueError):
        # Özel işlemler
        pass

# List comprehension ile filtreleme
value_errors = [e for e in eg.exceptions if isinstance(e, ValueError)]

b) Bellek Kullanımını Azaltma

python
Copy
Download
class LightweightExceptionGroup(BaseExceptionGroup):
    __slots__ = ()  # Bellek optimizasyonu
    
    def __str__(self):
        return f"{self.message}: {len(self.exceptions)} hata"

6. Gerçek Dünya Uygulama Örnekleri

a) Web Framework'ünde Hata Yönetimi

python
Copy
Download
async def handle_request(request):
    try:
        # Çeşitli işlemler
    except BaseExceptionGroup as eg:
        errors = {
            type(e).__name__: str(e)
            for e in eg.exceptions
        }
        return JSONResponse(
            {"error": "Multiple errors", "details": errors},
            status_code=500
        )

b) Veri İşleme Pipeline'ı

python
Copy
Download
def process_data(data):
    errors = []
    for item in data:
        try:
            transform(item)
        except Exception as e:
            errors.append(e)
    
    if errors:
        raise ExceptionGroup(
            "Veri işleme hataları",
            errors
        )

7. En İyi Uygulamalar ve Anti-Pattern'ler

Doğru Yaklaşımlar:
✔ İlgili hataları mantıksal gruplarda toplayın
✔ Hata mesajlarını açıklayıcı ve aksiyon alınabilir yapın
✔ except* kullanarak hata türlerine özel işlemler yapın

Kaçınılması Gerekenler:
✖ Tüm hataları tek bir grupta toplamak
✖ Hata gruplarını gereksiz iç içe geçirmek
✖ BaseExceptionGroup'u normal try-except ile yakalamaya çalışmak

Sonuç

Python 3.11 ile gelen BaseExceptionGroup, modern uygulamalarda karşılaşılan karmaşık hata senaryolarını yönetmek için güçlü bir araç sunar. Özellikle:

✅ Eşzamanlı programlarda çoklu hataları yönetme
✅ Hiyerarşik hata yapıları oluşturma
✅ Hata işleme kodunu merkezileştirme

konularında geliştiricilere önemli avantajlar sağlar. Bu yeni özelliği projelerinize entegre ederek daha sağlam ve bakımı kolay kodlar yazabilirsiniz.


Sık Sorulan Sorular (SSS)

❓ BaseExceptionGroup Python 3.11 öncesinde nasıl kullanılır?

  • Python 3.11 öncesinde resmi desteği yoktur, ancak benzer işlevsellik için Exception listeleri kullanılabilir.

❓ BaseExceptionGroup ile ExceptionGroup arasında ne zaman tercih yapmalıyım?

  • Sistem seviyesi hatalar (KeyboardInterrupt gibi) için BaseExceptionGroup, uygulama hataları için ExceptionGroup kullanın.

❓ except ve except arasındaki temel fark nedir?*

  • except tüm grubu ya hep ya hiç yakalar, except* ise grubu türlerine göre bölebilir.


Performans Karşılaştırması

YöntemAvantajlarDezavantajlar
Geleneksel try-exceptBasit, anlaşılırÇoklu hataları yönetemez
BaseExceptionGroupKarmaşık hataları yönetebilirPython 3.11+ gerektirir
Exception listeleriTüm Python sürümlerinde çalışırStandartlaşmış değil