İçeriğe geç

Recover'sız Goroutine (ARCH5169)

Anahtar go.logging.goroutine-no-recover · Önem info · Kategori logging

Bir goroutine içinde oluşan panic, kurtarılıp loglanmazsa tüm programı çökertir ve hata sessizce kaybolur. Fire-and-forget goroutine’lerde hatalar yakalanıp loglanmalı veya bir kanalla geri iletilmelidir.

func dispatch(jobs []Job) {
for _, j := range jobs {
go func(j Job) {
handle(j) // panic ederse program çöker
}(j)
}
}
func dispatch(log *slog.Logger, jobs []Job) {
for _, j := range jobs {
go func(j Job) {
defer func() {
if r := recover(); r != nil {
log.Error("job panicked", "id", j.ID, "panic", r)
}
}()
handle(j)
}(j)
}
}

Her goroutine’in başına recover içeren bir defer ekleyip panic’i loglayın veya geri iletin.