117 lines
5.0 KiB
Plaintext
117 lines
5.0 KiB
Plaintext
# 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<T, Hata> : 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<sayi, Hata>: başarıda bir sayı, başarısızlıkta bir hata taşır.
|
||
|
|
fonksiyon yas_coz(girdi: metin) -> sonuc<sayi, Hata>:
|
||
|
|
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<sayi, Hata>:
|
||
|
|
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ı.")
|