--- 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. ```kbl 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") ``` ```cikti İş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. ```kbl 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}") ``` ```cikti 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. ```kbl 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ı.") ``` ```cikti 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. ```kbl dongu bolen icinde [5, 0]: dene: yazdir(f"100 / {bolen} = {100 // bolen}") yakala: yazdir("bölme yapılamadı") sonunda: yazdir("--- işlem tamam") ``` ```cikti 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 ```alistirma `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 ``` ```alistirma `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 ```