CodeBlanks Logo Icon CodeBlanks

Exception chaining

raise ... from ile istisna zincirini öğrenirsin.

raise ... from ile zincirleme

Bir hata yakaladığında onu başka bir hata türüne çevirip fırlatabilirsin: raise RuntimeError("...") from e. from e kısmı orijinal hatayı yeni hatanın __cause__ özelliğine bağlar; bu sayede hata zinciri korunur.

Zincirleme, alt seviye hatayı üst seviye hataya sararken orijinal bağlamı kaybetmemek için kullanılır. Örneğin veritabanı hatasını RuntimeError'a çevirirken orijinal DatabaseError'ı __cause__ olarak tutmak, hata ayıklamayı kolaylaştırır.

İç içe try ile zincir

Zincirleme genelde iç içe try ile kullanılır. İçteki try düşük seviye hatayı yakalar, yeni bir hata fırlatır; dıştaki try bu yeni hatayı yakalar. Böylece katmanlı bir hata yönetimi kurulur.

Örneğin bir veri dönüştürme fonksiyonu ValueError'ı RuntimeError'a çevirip fırlatabilir; çağıran kod yalnızca RuntimeError'ı yakalar. __cause__ özelliği üzerinden orijinal ValueError'a erişebilir; bu sayede alt seviye nedeni görebilir.

Uygulama Zincirleme ile RuntimeError fırlat

İç içe iki try bloğu yaz. Dıştaki try: bloğu içinde ikinci bir try: bloğu olsun. İçteki blokta value = int("abc") çağrısı yapılsın ve except ValueError as e: bloğunda raise RuntimeError("Dönüştürme hatası") from e yaz. Dıştaki except RuntimeError as e: bloğunda print(type(e).__name__) ve print(type(e.__cause__).__name__) ile iki tür adını yazdır.

Başlangıç kodu

main.py
# İç içe try bloğu yaz
# İçte ValueError'ı RuntimeError'a çevir (from e ile)
# Dışta RuntimeError'ı yakala, tür ve kaynak türünü yazdır

Örnek çözüm

main.py
# İç içe try bloğu yaz
try:
    # İçte ValueError'ı RuntimeError'a çevir (from e ile)
    try:
        value = int("abc")
    except ValueError as e:
        raise RuntimeError("Dönüştürme hatası") from e
# Dışta RuntimeError'ı yakala, tür ve kaynak türünü yazdır
except RuntimeError as e:
    print(type(e).__name__)
    print(type(e.__cause__).__name__)

Beklenen çıktı

RuntimeError
ValueError

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Zincirleme kavramlarını eşleştir

Kavram Anlamı
from Zincirleme bağlacı
__cause__ Orijinal hata özelliği
raise Hata fırlatma
except Hata yakalama

2 raise X from e ne yapar?

  • Yeni hatayı eski hatasız fırlatır
  • Yeni hatayı eski hatanın alt sınıfı yapar
  • Yeni hatanın __cause__ özelliğini e'ye bağlar Doğru cevap
  • Eski hatayı susturur

Açıklama: Seçim yanlış. Doğru cevap: yeni hatanın __cause__ özelliğini e'ye bağlar. Zincir bu şekilde kurulur.

3 from e bağlacını tamamla

Soru
raise RuntimeError("Hata") ____ e
Cevap
raise RuntimeError("Hata") from e

Açıklama: from e bağı ile zincir kurulur.

Orta seviye bölümündeki tüm dersler