Exception chaining
- Python kursu
- Orta seviye
- Ders 84/116
- 5 dk
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
# İç 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
# İç 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
raise RuntimeError("Hata") ____ e
raise RuntimeError("Hata") from e
Açıklama: from e bağı ile zincir kurulur.