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
Lepaskan: 2024-12-12 14:52:10
asal
575 orang telah melayarinya

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

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

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

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

Contoh ini mencetak semua ralat dalam rantai:

error 0
error 1
error 2
Salin selepas log masuk

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!

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