Go Error: Is() dan As() Menyokong Pembungkusan Ralat Rekursif
Dalam Go, pengendalian ralat adalah penting untuk mengurus dan menganalisis ralat sepanjang permohonan. Antara muka ralat menyediakan cara biasa untuk mewakili ralat dan ia termasuk kaedah seperti Is() dan As() untuk introspeksi ralat.
Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa antara muka ralat standard tidak menyokong pembalut ralat rekursif . Ini bermakna jika anda menggunakan fmt.Errorf untuk membungkus ralat, anda tidak akan dapat menggunakan Is() dan As() untuk menyemak ralat asas secara rekursif.
Jenis Ralat Tersuai untuk Ralat Rekursif Membungkus
Untuk mencapai pembungkusan ralat rekursif, anda boleh mencipta jenis ralat tersuai yang melaksanakan ralat antara muka. Jenis ini harus termasuk rujukan kepada ralat yang dibalut dan mentakrifkan kaedah Is() dan As() tersuai untuk mendayakan perbandingan rekursif.
Berikut ialah contoh pelaksanaan jenis ralat rekursif:
type errorChain struct { err error next *errorChain } func (c errorChain) Is(err error) bool { // Check the current error against the given error if c.err == err { return true } // Check if there is a wrapped error and recursively call Is() if c.next != nil { return c.next.Is(err) } return false } func (c errorChain) As(target interface{}) bool { // Check if the current error As() to the target interface if errors.As(c.err, target) { return true } // Check if there is a wrapped error and recursively call As() if c.next != nil { return c.next.As(target) } return false }
Membalut Ralat Secara Rekursif
Setelah anda menentukan jenis ralat tersuai, anda boleh balut ralat secara rekursif menggunakan fungsi seperti berikut:
func Wrap(errs ...error) error { if len(errs) == 0 { return nil } // Create the first error in the chain out := &errorChain{err: errs[0]} // Iterate over the remaining errors for _, err := range errs[1:] { // Link the errors together out.next = &errorChain{err: err} out = out.next } return out }
Penggunaan
Anda kini boleh menggunakan jenis ralat tersuai ini untuk membalut ralat dan menyemak ralat asas secara rekursif menggunakan Is() dan As(). Contohnya:
var Err1 = errors.New("error 1") var Err2 = errors.New("error 2") var Err3 = errors.New("error 3") err := Wrap(Err1, Err2, Err3) fmt.Println(errors.Is(err, Err2)) // true fmt.Println(errors.Is(err, Err3)) // true fmt.Println(errors.Is(err, Err0)) // false
Kesimpulan
Dengan mencipta jenis ralat tersuai dengan kaedah Is() dan As() rekursif, anda boleh mencapai pembungkusan ralat rekursif dan melakukan pengendalian ralat yang lebih tepat dalam aplikasi Go anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Pembalut Ralat Rekursif dengan Is() dan As() dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!