Go
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.
Örnek çözümü göster
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...))
}
Kendini test et
-
errgroup'ta <code>g.Wait()</code> ne döndürür?
- İlk nil olmayan hatayı
- Tüm hataların listesini
- Son hatayı
- Her zaman nil
Cevabı göster
İlk nil olmayan hatayı — 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.
-
Hataları birleştir
return errors.____(hatalar...)
Cevabı göster
return errors.Join(hatalar...)
-
Strateji
- 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ı
Sıradaki ders: context.Background