CodeBlanks Logo Icon CodeBlanks

Meydan okuma 3 - Hata yönetimi

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

main.go
package main

import (
    "errors"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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ü

Soru
n, ____ := stok[urun]
if !ok {
    return ErrUrunYok
}
Cevap
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ı)

Başlangıç bölümündeki tüm dersler