# Hatalar: sonuc türüyle beklenen hatalar, ? ile yayma, dene/yakala/firlat # # Programlar her zaman yolunda gitmez: kullanıcı yanlış değer girer, bir sayı # sıfıra bölünür, listede olmayan bir sıra istenir. KabaLang'de iki yol vardır: # sonuc : beklenebilir hatalar için. Fonksiyon ya başarıyı (tamam) # ya da hatayı (hata) döndürür; çağıran ikisini de ele almak zorundadır. # dene / yakala / firlat : programın o noktada devam edemeyeceği durumlar için. # ── sonuc: başarı ya da hata döndüren fonksiyon ─────────────── # Dönüş türü sonuc: başarıda bir sayı, başarısızlıkta bir hata taşır. fonksiyon yas_coz(girdi: metin) -> sonuc: temiz = girdi.kirp() eger temiz.bos_mu(): don hata("yaş boş bırakılamaz") # Her karakter bir rakam mı? dongu harf icinde temiz: eger degil "0123456789".icerir(harf): don hata(f"'{temiz}' bir sayı değil") yas = sayi(temiz) eger yas > 130: don hata(f"{yas} yaş gerçekçi değil") don tamam(yas) # ── ?: hatayı yukarı iletmek ────────────────────────────────── # yas_coz(...)? şunu der: sonuç hataysa bu fonksiyondan da AYNI hatayla hemen çık; # başarılıysa içindeki sayıyı ver. Her adımda eger yazmaktan kurtarır. # ? yalnız kendisi de sonuc döndüren bir fonksiyonun içinde kullanılabilir. fonksiyon yas_farki(birinci: metin, ikinci: metin) -> sonuc: a = yas_coz(birinci)? b = yas_coz(ikinci)? eger a > b: don tamam(a - b) don tamam(b - a) # ── firlat: devam edilemeyen durum ──────────────────────────── # firlat çalışınca fonksiyon orada biter; 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 fonksiyon yesil(m: metin) -> metin: don "\033[32m" + m + "\033[0m" fonksiyon kirmizi(m: metin) -> metin: don "\033[31m" + m + "\033[0m" # ════════════════ Program buradan başlıyor ════════════════ # ── sonuc'u kullanmak ───────────────────────────────────────── yazdir("Yaş girdilerini denetleyelim:") dongu girdi icinde ["34", " 7 ", "", "otuz", "250"]: r = yas_coz(girdi) # tamam_mi() / hatali_mi() hangisi olduğunu söyler. # deger() başarıdaki sayıyı, hata().mesaj() hatanın açıklamasını verir. eger r.tamam_mi(): yazdir(yesil(" ✓ ") + f"\"{girdi}\" → {r.deger()} yaş") degilse: yazdir(kirmizi(" ✗ ") + f"\"{girdi}\" → {r.hata().mesaj()}") # sonuc döndüren bir fonksiyonu çağırıp sonucu hiç kullanmamak derleme hatasıdır: # yas_coz("12") tek başına bir satırda yazılırsa program derlenmez. # Sonucu bilerek atmak istiyorsan bunu açıkça yazarsın: _ = yas_coz("12") yazdir() yazdir("Yaş farkları:") dongu ikili icinde [["40", "12"], ["40", "kırk"], ["", "12"]]: f = yas_farki(ikili[0], ikili[1]) eger f.tamam_mi(): yazdir(f" {ikili[0]} ile {ikili[1]} arası {f.deger()} yıl") degilse: yazdir(f" hesaplanamadı: {f.hata().mesaj()}") yazdir() # ── dene / yakala ───────────────────────────────────────────── # dene bloğunda bir hata fırlatılırsa blok orada kesilir ve yakala bloğu çalışır. # yakala h: hata metnini h adıyla verir. Hata olmazsa yakala hiç çalışmaz. stok = 10 dongu istek icinde [3, 4, 0, 5]: dene: stok = stoktan_dus(stok, istek) yazdir(f" {istek} adet satıldı, stokta {stok} kaldı") yakala h: yazdir(kirmizi(" satış yapılamadı: ") + h) yazdir() # ── Dilin kendi fırlattığı hatalar ──────────────────────────── # Sıfıra bölme, listede olmayan bir sıra, sözlükte olmayan bir anahtar... # Yakalanmazlarsa program bu satırda durur. Yakalanırlarsa program devam eder. # Hata metni dosya adını ve satır numarasını da içerir; hatayı bulmanın ilk ipucu budur. bolen = 0 dene: yazdir(100 // bolen) yakala h: yazdir("Bölme hatası yakalandı:") yazdir(f" {h}") sehirler = ["Rize", "Artvin"] dene: yazdir(sehirler[5]) yakala h: yazdir("Liste hatası yakalandı:") yazdir(f" {h}") # yakala'dan sonra ad yazmazsak hata metni kullanılmaz, yalnız yakalanır. basarili = dogru dene: firlat "bağlantı kurulamadı" yakala: basarili = yanlis yazdir(f"İşlem başarılı mı? {basarili}") yazdir() yazdir("Bütün hatalar ele alındı; program sonuna kadar çalıştı.")