158 lines
4.3 KiB
Markdown
158 lines
4.3 KiB
Markdown
---
|
|||
|
|
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
|
||
|
|
```
|