Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mencapai Ralat Rekursif Benar Membungkus dan Membuka Balutan dalam Go?

Bagaimanakah Saya Boleh Mencapai Ralat Rekursif Benar Membungkus dan Membuka Balutan dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-12-12 14:52:10644semak imbas

How Can I Achieve True Recursive Error Wrapping and Unwrapping in Go?

Ralat Membungkus dengan Rekursif Is() dan As() dalam Go

Banyak pembangun mengesyorkan membungkus ralat dalam Go menggunakan fmt.Errorf dengan kata kerja %w, tetapi ini kaedah tidak menyediakan pembalut rekursif sebenar. Untuk menyemak ralat secara rekursif menggunakan Is() dan As(), jenis ralat tersuai boleh digunakan.

Jenis Ralat Tersuai untuk Rekursi

Berikut ialah Ralat jenis ralat tersuai yang menyokong pembungkusan ralat dan semakan 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
}

Menambah Is() dan As() pada Custom Taip

Kunci untuk mendayakan semakan rekursif adalah dengan melaksanakan kedua-dua kaedah Is() dan As() pada jenis tersuai. Kaedah ini membenarkan perbandingan ralat pada ralat yang terkandung dalam rantai, dan bukannya rantai itu sendiri:

func (c errorChain) Is(err error) bool { return errors.Is(c.err, err) }

func (c errorChain) As(target any) bool { return errors.As(c.err, target) }

Menggunakan Ralat Rantai

Dengan kaedah ini disediakan, anda boleh membalut ralat dan melakukan semakan rekursif :

errs := Wrap(errors.New("error 0"), errors.New("error 1"), errors.New("error 2"))

fmt.Println(errors.Is(errs, errors.New("error 0")))  // true
fmt.Println(errors.Is(errs, errors.New("error 1")))  // true
fmt.Println(errors.Is(errs, errors.New("error 2")))  // true

Menggunakan Unwrap() untuk Mengulang Rantai

The Kaedah Unwrap() dalam errorChain membolehkan anda melintasi ralat yang dibalut dalam rantai:

var currentError error = errs
for {
    currentError = errors.Unwrap(currentError)
    if currentError == nil {
        break
    }
    fmt.Println(currentError)
}

Contoh ini mencetak semua ralat dalam rantai:

error 0
error 1
error 2

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Ralat Rekursif Benar Membungkus dan Membuka Balutan 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