Hata yönetimi
- Go kursu
- Orta seviye
- Ders 28/80
- 6 dk
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 nilerrors.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
package main
import (
"errors"
"fmt"
"sync"
)
func main() {
// buraya yaz
}Örnek çözüm
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
return errors.____(hatalar...)
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ı |