Files
ornekler/dersler/26-istisnalar.md
T
semih 494781e84f Dersler ve Temeller; web örnekleri PORT ortam değişkenini okur
- dersler/: 29 kısa ders (açıklama, çalıştırılabilir örnek, alıştırma). Her örneğin
  ve alıştırma çözümünün çıktısı Online IDE'nin hazırlık adımında gerçekten koşulup
  dosyadakiyle karşılaştırılır; biçim dersler/BICIM.md.
- temeller/: tek konulu 12 başlangıç programı.
- web/anket, web/kisalt, web/pano: port PORT ortam değişkeninden okunur (Online IDE
  önizlemesi 8080 verir), yoksa eski sabit port.
- README: öğrenme bölümü, Online IDE bağlantısı.
2026-10-17 22:07:47 +03:00

4.3 KiB


baslik: Hata yakalama: dene ve yakala bolum: Hatalar ve dosyalar ozet: firlat, dene, yakala ve sonunda ile beklenmeyen durumlar

sonuc beklenebilir hatalar içindir. Bazı durumlarda ise program o noktada devam edemez: stokta olmayan bir ürün satılmaya çalışılır, listede olmayan bir sıra istenir. Böyle durumlarda hata fırlatılır; onu yakalayan bir dene bloğu yoksa program durur.

dene ve yakala

dene bloğunda bir hata fırlatılırsa blok orada kesilir ve yakala bloğu çalışır. yakala h: hata mesajını h adıyla verir.

dene:
    yazdir("İşlem başlıyor")
    firlat "bağlantı kurulamadı"
    yazdir("Bu satır çalışmaz")
yakala h:
    yazdir("Yakalandı: " + h)
yazdir("Program devam ediyor")
İşlem başlıyor
Yakalandı: bağlantı kurulamadı
Program devam ediyor

Hata olmazsa yakala bloğu hiç çalışmaz.

Fonksiyondan hata fırlatmak

firlat hata("mesaj") fonksiyonu orada bitirir; hata, onu yakalayan ilk dene bloğuna kadar çıkar.

fonksiyon stoktan_dus(stok: sayi, adet: sayi) -> sayi:
    eger adet <= 0:
        firlat hata(f"geçersiz adet: {adet}")
    eger adet > stok:
        firlat hata(f"stokta {stok} ürün var, {adet} istendi")
    don stok - adet

kalan = 10
dongu istek icinde [3, 4, 0, 5]:
    dene:
        kalan = stoktan_dus(kalan, istek)
        yazdir(f"{istek} adet satıldı, {kalan} kaldı")
    yakala h:
        yazdir(f"Satış yapılamadı: {h}")
3 adet satıldı, 7 kaldı
4 adet satıldı, 3 kaldı
Satış yapılamadı: geçersiz adet: 0
Satış yapılamadı: stokta 3 ürün var, 5 istendi

Dilin kendi fırlattığı hatalar

Sıfıra bölme, listede olmayan bir sıra, sözlükte olmayan bir anahtar... Bunlar da fırlatılan hatalardır. Yakalanırlarsa program devam eder.

sehirler = ["Rize", "Artvin"]
dene:
    yazdir(sehirler[5])
yakala:
    yazdir("Listede 5. sırada şehir yok.")

bolen = 0
dene:
    yazdir(100 // bolen)
yakala:
    yazdir("Sıfıra bölme yakalandı.")
Listede 5. sırada şehir yok.
Sıfıra bölme yakalandı.

yakala'dan sonra ad yazmazsan hata mesajı kullanılmaz, yalnız yakalanır.

Dikkat: Yakalanmayan bir hata programı o satırda durdurur ve altındaki hiçbir şey çalışmaz. Ama her şeyi dene içine sarmak da hatayı gizler. Beklenen durumlar (geçersiz girdi gibi) için sonuc, gerçekten olağandışı durumlar için firlat kullan.

sonunda: her durumda çalışan blok

sonunda: bloğu, hata olsa da olmasa da en son çalışır. Temizlik işleri (dosyayı kapatmak, "işlem bitti" demek) için kullanılır.

dongu bolen icinde [5, 0]:
    dene:
        yazdir(f"100 / {bolen} = {100 // bolen}")
    yakala:
        yazdir("bölme yapılamadı")
    sonunda:
        yazdir("--- işlem tamam")
100 / 5 = 20
--- işlem tamam
bölme yapılamadı
--- işlem tamam

Hangi yolu seçmeli?

Durum Yol
Kullanıcı yanlış değer girdi, kayıt bulunamadı sonuc / belki döndür
Programın o noktada devam etmesi anlamsız firlat
Bir hatayı yakalayıp programı sürdürmek dene / yakala

Alıştırma

`yas_kontrol(yas: sayi) -> sayi` fonksiyonu yaş 0'dan küçükse `"yaş negatif olamaz"` hatası fırlatsın, değilse yaşı döndürsün. Verilen her yaş için `dene/yakala` ile ya `Yaş: 25` ya da `Hata: yaş negatif olamaz` yazdır.
%%%
# buraya yaz

dongu y icinde [25, -3]:
    dene:
        yazdir(f"Yaş: {yas_kontrol(y)}")
    yakala h:
        yazdir(f"Hata: {h}")
%%%
fonksiyon yas_kontrol(yas: sayi) -> sayi:
    eger yas < 0:
        firlat hata("yaş negatif olamaz")
    don yas

dongu y icinde [25, -3]:
    dene:
        yazdir(f"Yaş: {yas_kontrol(y)}")
    yakala h:
        yazdir(f"Hata: {h}")
%%%
Yaş: 25
Hata: yaş negatif olamaz
`fiyat` sözlüğünde olmayan bir ürünü okumak hata fırlatır. `sepet` listesindeki her ürün için `dene/yakala` ile fiyatı yazdır; bulunamayan ürün için `muz: fiyat yok` yaz.
%%%
fiyat = {"elma": 30, "armut": 45}
sepet = ["elma", "muz", "armut"]
# buraya yaz
%%%
fiyat = {"elma": 30, "armut": 45}
sepet = ["elma", "muz", "armut"]
dongu urun icinde sepet:
    dene:
        yazdir(f"{urun}: {fiyat[urun]} TL")
    yakala:
        yazdir(f"{urun}: fiyat yok")
%%%
elma: 30 TL
muz: fiyat yok
armut: 45 TL