Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Fungsi `Is()` dan `As()` Go Mengendalikan Pembalut Ralat Rekursif?

Bagaimanakah Fungsi `Is()` dan `As()` Go Mengendalikan Pembalut Ralat Rekursif?

Patricia Arquette
Lepaskan: 2024-12-16 10:52:10
asal
688 orang telah melayarinya

How Do Go's `Is()` and `As()` Functions Handle Recursive Error Wrapping?

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
}
Salin selepas log masuk

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"
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan