CodeBlanks Logo Icon CodeBlanks

Hata yönetimi

Worker'larda hata yönetimini ve WaitGroup'ı eklersin.

Hata yönetimi ve kapanış

Bir iş hata verdiğinde iki seçenek vardır: hatayı sonuçla birlikte bildirip devam etmek ya da ilk hatada tüm işleri durdurmak. İkincisi için golang.org/x/sync/errgroup idealdir:

g, ctx := errgroup.WithContext(ctx)
g.SetLimit(3)  // en fazla 3 eşzamanlı iş
for _, yol := range dosyalar {
    g.Go(func() error { return isle(ctx, yol) })
}
if err := g.Wait(); err != nil {
    log.Println("ilk hata:", err)
}

İlk hata ctx'i iptal eder; diğer işler ctx'i kontrol edip erken bırakır.

Hataları birleştirmek

"Tüm işleri dene, sonunda tüm hataları göster" istiyorsan hataları toplayıp errors.Join ile tek hataya çevirebilirsin (Go 1.20):

var hatalar []error
for s := range sonuclar {
    if s.Hata != nil {
        hatalar = append(hatalar, fmt.Errorf("iş %d: %w", s.IsID, s.Hata))
    }
}
return errors.Join(hatalar...)  // hata yoksa nil

errors.Is birleşik hatanın içindeki her hatayı yine bulabilir.

Uygulama Hata toplama

Üç iş çalıştır; ID'si 1 olan iş errors.New("okunamadı") hatası versin. Sonuçlardaki hataları fmt.Errorf("iş %d: %w", ...) ile sarıp toplayın ve errors.Join sonucunu yazdır.

Başlangıç kodu

main.go
package main

import (
    "errors"
    "fmt"
    "sync"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "errors"
    "fmt"
    "sync"
)

type Sonuc struct {
    IsID int
    Hata error
}

func main() {
    sonuclar := make(chan Sonuc)
    var wg sync.WaitGroup
    for i := 0; i < 3; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            var err error
            if id == 1 {
                err = errors.New("okunamadı")
            }
            sonuclar <- Sonuc{id, err}
        }(i)
    }
    go func() {
        wg.Wait()
        close(sonuclar)
    }()
    var hatalar []error
    for s := range sonuclar {
        if s.Hata != nil {
            hatalar = append(hatalar, fmt.Errorf("iş %d: %w", s.IsID, s.Hata))
        }
    }
    fmt.Println(errors.Join(hatalar...))
}

Beklenen çıktı

iş 1: okunamadı

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 errgroup'ta <code>g.Wait()</code> ne döndürür?

  • İlk nil olmayan hatayı Doğru cevap
  • Tüm hataların listesini
  • Son hatayı
  • Her zaman nil

Açıklama: errgroup ilk hatayı saklar ve Wait onu döndürür; tüm hatalar gerekiyorsa sonuç kanalı yöntemi ya da errors.Join kullanılır.

2 Hataları birleştir

Soru
return errors.____(hatalar...)
Cevap
return errors.Join(hatalar...)

Açıklama: errors.Join birden çok hatayı tek hataya birleştirir; liste boşsa nil döner.

3 Strateji

Kavram Anlamı
Sonuc.Hata Hatayı bildir, devam et
errgroup İlk hatada dur
errors.Join Tüm hataları göster
g.SetLimit(3) Eşzamanlılık sınırı

Orta seviye bölümündeki tüm dersler