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.
Hatalı
Bölüm başlığı “Hatalı”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)}Düzeltme
Bölüm başlığı “Düzeltme”defer içinde panic atmak yerine hatayı adlandırılmış dönüş değerine atayın ve mevcut hatayı ezmeyin.