Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mencapai Pembalut Ralat Rekursif dengan Is() dan As() dalam Go?

Bagaimanakah Saya Boleh Mencapai Pembalut Ralat Rekursif dengan Is() dan As() dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-11 10:42:11302semak imbas

How Can I Achieve Recursive Error Wrapping with Is() and As() in Go?

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!

Kenyataan:
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