Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengendalikan Penyebaran Ralat dalam Abstraksi Multi-Layer Go dengan Berkesan?
Penyebaran Ralat dalam Abstraksi Berbilang Lapisan
Dalam Go, pengendalian ralat merentasi pelbagai peringkat abstraksi boleh menjadi satu cabaran kerana keperluan meneruskan ralat ke atas. Ini selalunya membawa kepada mesej pengelogan pendua atau kehilangan maklumat kontekstual.
Penyelesaian Disyorkan: Anotasi Ralat
Kaedah pengendalian ralat pilihan adalah dengan menganotasi ralat sebagaimana adanya melalui tahap abstraksi yang berbeza. Ini membolehkan untuk mengekalkan konteks ralat asal sambil menambah maklumat tambahan pada setiap peringkat.
Menggunakan perpustakaan seperti "github.com/pkg/errors," pengendalian ralat boleh dilaksanakan sebagai berikut:
// Wraps the original error with additional context. func (o *ObjectOne) CheckValue() error { if o.someValue == 0 { return errors.New("Object1 illegal state: value is 0") } return nil } // Annotates the original error with context. func (oT *ObjectTwoHigherLevel) CheckObjectOneIsReady() error { if err := oT.objectOne.CheckValue(); err != nil { return errors.Wrap(err, "Object2 illegal state: Object1 is invalid") } return nil } // Preserves the annotated error stack. func (oTh *ObjectThreeHiggerLevel) CheckObjectTwoIsReady() error { if err := oTh.ObjectTwoHigherLevel.CheckObjectOneIsReady(); err != nil { return errors.Wrap(err, "Object3 illegal state: Object2 is invalid") } return nil }
Penggunaan:
o3 := &ObjectThreeHiggerLevel{} if err := o3.CheckObjectTwoIsReady(); err != nil { fmt.Println(err) }
Output:
Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0
Pendekatan ini menyediakan dan mekanisme pengendalian ralat bermaklumat yang mengelakkan pembalakan pendua dan mengekalkan kontekstual maklumat.
Alternatif: Sambungan Ralat
Untuk kesederhanaan, pendekatan alternatif ialah memanjangkan ralat asal dengan konteks tambahan menggunakan fmt.Errorf():
func (o *ObjectOne) CheckValue() error { if o.someValue == 0 { return fmt.Errorf("Object1 illegal state: value is %d", o.someValue) } return nil }
Penggunaan:
o3 := &ObjectThreeHiggerLevel{} if err := o3.CheckObjectTwoIsReady(); err != nil { fmt.Println(err) }
Output:
Object3 illegal state: Object2 illegal state: Object1 illegal state: value is 0
Ini pendekatan kurang serba boleh berbanding anotasi ralat tetapi lebih mudah untuk dilaksanakan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Penyebaran Ralat dalam Abstraksi Multi-Layer Go dengan Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!