Fungsi pengendalian ralat Go, Is() dan As(), mendakwa sebagai rekursif, membolehkan pembongkaran berbilang bersarang kesilapan. Walau bagaimanapun, tidak jelas sama ada wujud jenis terbina dalam yang melaksanakan antara muka ralat dan menyokong fungsi rekursif ini tanpa masalah.
Pelaksanaan Tersuai yang Cacat
Percubaan untuk mencipta tersuai jenis ralat sering menghadapi masalah berpunca daripada fakta bahawa ralat dibandingkan dengan alamat dalam Go. Jenis tersuai yang membalut ralat sebagai penunjuk mengakibatkan tingkah laku yang tidak dijangka, seperti ralat induk yang diubah suai yang mempengaruhi pembalut berikutnya.
Penyelesaian Boleh Digunakan
Penyelesaian yang lebih mantap melibatkan penciptaan jenis ralat baharu, errorChain. Jenis ini mengandungi medan ralat untuk menyimpan ralat semasa dan medan seterusnya untuk merujuk ralat seterusnya dalam rantaian. Selain itu, ia melaksanakan kaedah Is() dan As() untuk memudahkan pembongkaran ralat rekursif.
Membungkus dan Membuka
Fungsi Wrap() mengambil berbilang ralat, mencipta objek errorChain, dan menghubungkannya bersama-sama. Fungsi Unwrap() melintasi rantai, mengembalikan ralat seterusnya dalam jujukan.
Contoh
Menggunakan jenis Ralat Rantai, anda boleh membalut dan membuka ralat secara rekursif:
type errorChain struct { err error next *errorChain } func Wrap(errs ...error) error { out := errorChain{err: errs[0]} n := &out for _, err := range errs[1:] { n.next = &errorChain{err: err} n = n.next } return out } func (c errorChain) Is(err error) bool { return c.err == err } func (c errorChain) As(target any) bool { return errors.As(c.err, target) }
Taman permainan: https://go.dev/play/p/6BYGgIb728k
Atas ialah kandungan terperinci Adakah `Is()` dan `As()` Go Benar-benar Menawarkan Pembukaan Ralat Rekursif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!