Dersler ve Temeller; web örnekleri PORT ortam değişkenini okur
- dersler/: 29 kısa ders (açıklama, çalıştırılabilir örnek, alıştırma). Her örneğin ve alıştırma çözümünün çıktısı Online IDE'nin hazırlık adımında gerçekten koşulup dosyadakiyle karşılaştırılır; biçim dersler/BICIM.md. - temeller/: tek konulu 12 başlangıç programı. - web/anket, web/kisalt, web/pano: port PORT ortam değişkeninden okunur (Online IDE önizlemesi 8080 verir), yoksa eski sabit port. - README: öğrenme bölümü, Online IDE bağlantısı.
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
---
|
||||
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
|
||||
```
|
||||
Reference in New Issue
Block a user