Files

158 lines
4.3 KiB
Markdown
Raw Permalink Normal View History

---
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
```