Rumah > pembangunan bahagian belakang > Golang > Adakah `Is()` dan `As()` Go Benar-benar Menawarkan Pembukaan Ralat Rekursif?

Adakah `Is()` dan `As()` Go Benar-benar Menawarkan Pembukaan Ralat Rekursif?

Patricia Arquette
Lepaskan: 2024-12-15 19:29:10
asal
933 orang telah melayarinya

Does Go's `Is()` and `As()` Truly Offer Recursive Error Unwrapping?

Adakah Ralat Mengendalikan Tuntutan Rekursi Go Tepat?

Fungsi pengendalian ralat Go, Is() dan As(), mendakwa sebagai rekursif, membolehkan pembongkaran berbilang bersarang kesilapan. Walau bagaimanapun, tidak jelas sama ada wujud jenis terbina dalam yang melaksanakan antara muka ralat dan menyokong fungsi rekursif ini tanpa masalah.

Pelaksanaan Tersuai yang Cacat

Percubaan untuk mencipta tersuai jenis ralat sering menghadapi masalah berpunca daripada fakta bahawa ralat dibandingkan dengan alamat dalam Go. Jenis tersuai yang membalut ralat sebagai penunjuk mengakibatkan tingkah laku yang tidak dijangka, seperti ralat induk yang diubah suai yang mempengaruhi pembalut berikutnya.

Penyelesaian Boleh Digunakan

Penyelesaian yang lebih mantap melibatkan penciptaan jenis ralat baharu, errorChain. Jenis ini mengandungi medan ralat untuk menyimpan ralat semasa dan medan seterusnya untuk merujuk ralat seterusnya dalam rantaian. Selain itu, ia melaksanakan kaedah Is() dan As() untuk memudahkan pembongkaran ralat rekursif.

Membungkus dan Membuka

Fungsi Wrap() mengambil berbilang ralat, mencipta objek errorChain, dan menghubungkannya bersama-sama. Fungsi Unwrap() melintasi rantai, mengembalikan ralat seterusnya dalam jujukan.

Contoh

Menggunakan jenis Ralat Rantai, anda boleh membalut dan membuka ralat secara 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
}

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

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

Taman permainan: https://go.dev/play/p/6BYGgIb728k

Atas ialah kandungan terperinci Adakah `Is()` dan `As()` Go Benar-benar Menawarkan Pembukaan 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