Go Error: Membongkar Misteri Is() dan As()
Dalam Go, pengendalian ralat adalah penting untuk menyediakan diagnostik yang bermakna dan melaksanakan program yang mantap. Pakej ralat menawarkan fungsi Is() dan As() untuk menentukan kesamaan ralat dan mengekstrak butiran khusus, masing-masing. Salah tanggapan biasa ialah fungsi ini menyokong pembalut ralat rekursif, membolehkan pembongkaran berbilang ralat bersarang.
Walau bagaimanapun, setelah diperiksa dengan lebih teliti, fungsi fmt.Errorf standard tidak menyediakan pembalut ralat rekursif. Ini bermakna ralat pembalut menggunakan %w tidak membenarkan laluan penuh bagi rantaian ralat.
Untuk menangani isu ini, jenis ralat tersuai boleh ditakrifkan yang melaksanakan antara muka ralat dan melaksanakan Is() dan Kaedah As(). Ini membolehkan pembongkaran rekursif berbilang ralat bersarang.
Contoh:
type customError struct { err error wrapped *customError } func (c *customError) Error() string { if c.err != nil { return c.err.Error() } return "Custom error without cause" } func (c *customError) Is(err error) bool { if c.err != nil { return errors.Is(c.err, err) } return false } func (c *customError) As(target interface{}) bool { if c.err != nil { return errors.As(c.err, target) } return false } func Wrap(errs ...error) error { var rootError *customError for i := len(errs) - 1; i >= 0; i-- { rootError = &customError{ err: errs[i], wrapped: rootError, } } return rootError }
Dengan jenis ralat tersuai ini, anda boleh membalut dan membuka berbilang ralat dengan mudah serta melakukan Is() dan As rekursif () semak:
err := Wrap(Err1, Err2, Err3) fmt.Println(errors.Is(err, Err1)) // true fmt.Println(errors.Is(err, Err3)) // false var errType ErrType errors.As(err, &errType) fmt.Println(errType) // "my error type"
Walaupun pelaksanaan tersuai ini menyediakan pembongkaran ralat rekursif, terdapat pada masa ini tiada jenis terbina dalam dalam pustaka standard Go yang menyediakan fungsi ini di luar kotak. Walau bagaimanapun, perpustakaan seperti github.com/pkg/errors menawarkan keupayaan pengendalian ralat tambahan, termasuk pembongkaran rekursif, yang mungkin patut dipertimbangkan dalam projek anda sendiri.
Atas ialah kandungan terperinci Bagaimanakah Fungsi `Is()` dan `As()` Go Mengendalikan Pembalut Ralat Rekursif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!