İçeriğe geç

Defer İçinde Panic (ARCH5155)

Anahtar go.logging.panic-in-defer · Önem error · Kategori logging

Bir defer bloğu içinde panic atmak veya kontrol edilmemiş bir çağrı ile panic’e yol açmak, fonksiyon gövdesinde uçuştaki gerçek hatayı maskeler. Bu, bir finally bloğundan exception fırlatmanın Go’daki karşılığıdır.

func process(path string) error {
f, err := os.Open(path)
if err != nil {
return err
}
defer func() {
if err := f.Close(); err != nil {
panic(err) // gerçek hatayı maskeler
}
}()
return parse(f)
}
func process(path string) (err error) {
f, err := os.Open(path)
if err != nil {
return err
}
defer func() {
if cerr := f.Close(); cerr != nil && err == nil {
err = cerr
}
}()
return parse(f)
}

defer içinde panic atmak yerine hatayı adlandırılmış dönüş değerine atayın ve mevcut hatayı ezmeyin.