Meydan okuma 3 - Hata yönetimi
- Go kursu
- Başlangıç
- Ders 89/90
- 8 dk
Hata döndüren bir fonksiyon ve çağıran kod yazarsın.
Meydan okuma: güvenli sipariş
Hata yönetimini uygulayacaksın. siparisVer(stok map[string]int, urun string, adet int) error fonksiyonu üç kuralı denetlesin:
- adet 1'den küçükse
ErrGecersizAdet - ürün stokta yoksa
ErrUrunYok - stok yetmiyorsa
fmt.Errorf("%s için yalnızca %d adet var: %w", urun, n, ErrYetersizStok)
Hata yoksa stoktan düşüp nil döndürsün.
Plan
1) Üç sentinel hatayı var (...) bloğunda errors.New ile tanımla. 2) Önce adedi, sonra ürünün varlığını (n, ok := stok[urun]), sonra yeterliliği kontrol et; her durumda erken dön. 3) Hepsi geçerse stok[urun] -= adet ve return nil. Sıra önemlidir: önce ucuz ve genel kontroller.
Uygulama Sipariş fonksiyonu
Plana göre fonksiyonu ve hataları yaz. stok := map[string]int{"kalem": 3} için sırayla ("kalem", 2), ("kalem", 5) ve ("silgi", 1) siparişlerini ver; her hatayı (nil dahil) ayrı satırda, sonda errors.Is(err2, ErrYetersizStok) sonucunu yazdır.
Başlangıç kodu
package main
import (
"errors"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"errors"
"fmt"
)
var (
ErrGecersizAdet = errors.New("geçersiz adet")
ErrUrunYok = errors.New("ürün yok")
ErrYetersizStok = errors.New("yetersiz stok")
)
func siparisVer(stok map[string]int, urun string, adet int) error {
if adet < 1 {
return ErrGecersizAdet
}
n, ok := stok[urun]
if !ok {
return ErrUrunYok
}
if adet > n {
return fmt.Errorf("%s için yalnızca %d adet var: %w", urun, n, ErrYetersizStok)
}
stok[urun] -= adet
return nil
}
func main() {
stok := map[string]int{"kalem": 3}
err1 := siparisVer(stok, "kalem", 2)
err2 := siparisVer(stok, "kalem", 5)
err3 := siparisVer(stok, "silgi", 1)
fmt.Println(err1)
fmt.Println(err2)
fmt.Println(err3)
fmt.Println(errors.Is(err2, ErrYetersizStok))
}Beklenen çıktı
<nil> kalem için yalnızca 1 adet var: yetersiz stok ürün yok true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Çağıran "stok yetersiz" durumunu nasıl tanır?
- err.Error() == "yetersiz stok"
- err != nil
- errors.Is(err, ErrYetersizStok) Doğru cevap
- err == ErrYetersizStok
Açıklama: Hata %w ile sarıldığı için == başarısız olur; errors.Is zincirde ErrYetersizStok'u bulur.
2 Varlık kontrolü
n, ____ := stok[urun]
if !ok {
return ErrUrunYok
}
n, ok := stok[urun]
if !ok {
return ErrUrunYok
}
Açıklama: comma-ok biçimi ürünün map'te olup olmadığını söyler.
3 Sipariş ve sonuç (kalem: 3)
| Kavram | Anlamı |
|---|---|
kalem, 2 |
nil, stok 1 |
kalem, 0 |
ErrGecersizAdet |
silgi, 1 |
ErrUrunYok |
kalem, 9 |
ErrYetersizStok (sarılı) |