Resim

İleri Hata Yönetimi

İleri Hata Yönetimi: Özel İstisnalar ve Zincirleme

Temel try-except yapısı hataları yakalamayı sağlarken, ileri düzey hata yönetimi, hataların nedenini daha açık ve spesifik hale getirmeyi hedefler.

1. Özel İstisnalar (Custom Exceptions) Tanımlama

Python'daki tüm istisnalar (ValueError, TypeError vb.) temel Exception sınıfından türetilmiştir. Kendi özel hata sınıflarınızı tanımlamak, uygulamanızın mantığına özgü hataları yakalamayı ve iletmeyi sağlar.

Neden Kullanılır?

Diyelim ki bir kullanıcı girişi bekliyorsunuz. Geleneksel olarak ValueError fırlatabilirsiniz. Ancak, özel bir hata fırlatmak, hatanın nedenini daha açık hale getirir.

  • Örnek Senaryo: Bir kullanıcının yaşı 0'dan küçük girilemez.

Uygulama: Sınıf Tanımlama

Kendi özel istisna sınıfınızı tanımlamak için, onu sadece Exception sınıfından miras almanız yeterlidir.

# 1. Exception sınıfından miras alarak özel hata sınıfımızı 
#tanımlıyoruz
class GecersizYasHatasi(Exception):
    """Yaşın sıfırdan küçük veya çok büyük girilmesi durumunda 
    fırlatılır."""

    # __init__ metodunu özelleştirerek mesaj ekleyebiliriz
    def __init__(self, yas_degeri):
        self.yas = yas_degeri
        self.message = f"Hata: Yaş değeri ({self.yas}) 
geçerli aralığın dışındadır (0-150)."
        # Miras aldığımız Exception sınıfının init metodunu 
        #çağırıyoruz
        super().__init__(self.message)

def yas_kontrolu(yas):
    if not 0 <= yas <= 150:
        # Kendi özel hatamızı fırlatıyoruz
        raise GecersizYasHatasi(yas)
    return f"Yaşınız {yas}, kontrol başarılı."

# Kullanım:
try:
    print(yas_kontrolu(180))
except GecersizYasHatasi as e:
    # Hata yakalandığında, özel mesajımız ekrana basılır
    print(f"Özel Hata Yakalandı: {e}")
    # print(f"Hatalı Yaş Verisi: {e.yas}")

Kendiniz Deneyebilirsiniz:

2. İstisna Zincirleme (Exception Chaining)

Bazen bir hata yakalandığında, bu hatanın nedeni başka bir altta yatan (underlying) hatadır. İstisna zincirleme, asıl hatayı gizlemeden, üzerine yeni bir hata fırlatmanızı sağlar.

Bu, bir API çağrısı başarısız olduğunda, bu başarısızlığın kök nedeninin bir veritabanı bağlantı hatası olduğunu göstermek için önemlidir.

Uygulama: from Anahtar Kelimesi

Zincirleme, raise <YeniHata> from <OrijinalHata> söz dizimi ile yapılır.

class VeriIslemeHatasi(Exception):
    """Genel Veri İşleme Hataları için."""
    pass

class BaglantiHatasi(Exception):
    """Veritabanı bağlantı sorunları için."""
    pass


def veritabanina_baglan():
    # Diyelim ki burada bir bağlantı hatası oluştu
    raise BaglantiHatasi("Veritabanı sunucusuna erişilemedi.")

def veriyi_isleme():
    try:
        veritabanina_baglan()
    except BaglantiHatasi as baglanti_hata:
        # Bağlantı hatasını yakala, ancak bunun bir Veri İşleme 
        #hatasına yol açtığını söyle
        # from anahtar kelimesi ile zincirle
        raise VeriIslemeHatasi("Veri alınamadı, bağlantı hatası 
        nedeniyle.") from baglanti_hata

# Kullanım:
try:
    veriyi_isleme()
except VeriIslemeHatasi as isleme_hata:
    print(f"Ana Hata: {isleme_hata}")
    # Zincirleme sayesinde, orijinal hatayı (BaglantiHatasi) 
    #da görebiliriz.
    print(f"Kök Nedeni: {isleme_hata.__cause__}") 

# Çıktı:
# Ana Hata: Veri alınamadı, bağlantı hatası nedeniyle.
# Kök Nedeni: Veritabanı sunucusuna erişilemedi.

Kendiniz Deneyebilirsiniz:

3. Hatanın Yeniden Yükseltilmesi (raise Tek Başına)

Bir istisnayı yakalayıp bazı temizlik veya loglama işlemleri yaptıktan sonra, hatayı olduğu gibi yukarı katmana (fonksiyonu çağıran yere) göndermek gerekebilir.

Eğer except bloğu içinde sadece raise komutunu tek başına kullanırsanız, o anda yakalanan hatayı orijinal haliyle (traceback bilgisi dahil) yeniden fırlatır.

def dosya_okuyucu(dosya_adi):
    try:
        f = open(dosya_adi, 'r')
        # ... dosya işlemleri ...
    except FileNotFoundError:
        print(f"Hata: {dosya_adi} bulunamadı. Loglama yapıldı.")
        # Hata yakalandı, loglandı ama yine de programın çökmesi 
        #isteniyor.
        raise # Orijinal FileNotFoundError hatasını yeniden fırlatır

# Kullanım:
try:
    dosya_okuyucu("olmayan_dosya.txt")
except Exception as e:
    print(f"Program akışı sonlandırıldı. Yakalanan hata: {e}")

Bu üç teknik, Python kodunuzda sadece hataları gizlemek yerine, onları anlamayı, özelleştirmeyi ve izlemeyi sağlayan ileri düzey hata yönetimi prensipleridir.

Kendiniz Deneyebilirsiniz:

🔥 Python Kariyerinizi Hemen Başlatın!

Hemen kursumuza kaydolun ve bu güçlü araçları kullanarak profesyonel Python geliştiricisi olma yolunda ilk adımı atın. Kursumuzdaki uygulamalı modüller, sizi sadece bir yazılımcı adayı değil, hazır bir profesyonel haline getirecek. Python Eğitimini Udemy platformunda bulabilirsiniz.

[ Python Eğitimi Sıfırdan İleri Seviye ]

Tıklayın ve Python Eğitimine Hemen Kaydolun!

Yorumlar

Bu blogdaki popüler yayınlar

Python random Modülü

Python print()

Yazılım Nedir?