Rumah > pembangunan bahagian belakang > Golang > Bagaimana Saya Boleh Pulih daripada Panik dalam Go Goroutines?

Bagaimana Saya Boleh Pulih daripada Panik dalam Go Goroutines?

DDD
Lepaskan: 2024-12-13 09:01:10
asal
534 orang telah melayarinya

How Can I Recover from Panics in Go Goroutines?

Pemulihan Panik Generik dalam Program Go

Apabila bekerja dengan rutin Go, mungkin terdapat keadaan di mana anda ingin menangkap dan mengendalikan ranap atau panik yang berlaku di dalamnya, berpotensi untuk melaporkan kepada pelayan pelaporan ralat seperti Sentry atau Raygun. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa goroutine tidak boleh pulih daripada panik dalam goroutine lain.

Pendekatan Idiomatik

Cara idiomatik untuk menangani perkara ini adalah dengan memasukkan kod ke dalam fungsi yang dilancarkan sebagai goroutine. Ini melibatkan penggunaan fungsi tertunda yang memanggil recover(), yang menyediakan keupayaan untuk pulih daripada keadaan panik.

Pertimbangkan contoh berikut:

go func() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Caught:", r)
        }
    }()

    panic("catch me")
}()
Salin selepas log masuk

Kod ini akan mengeluarkan panik yang berkaitan mesej apabila dilaksanakan.

Walaupun tidak praktikal untuk melaksanakan pendekatan ini dalam setiap goroutine yang anda lancarkan, anda boleh mudahkan proses dengan mentakrifkan fungsi bernama yang merangkumi fungsi pemulihan dan panggil fungsi itu dalam goroutine anda (dengan panggilan tertunda).

func logger() {
    if r := recover(); r != nil {
        fmt.Println("Caught:", r)
    }
}
Salin selepas log masuk

Dengan memanggil fungsi ini dalam penutupan tertunda, anda boleh mengendalikan panik situasi dengan ringkas.

go func() {
    defer logger()
    panic("catch me")
}()
Salin selepas log masuk

Pembungkus Fungsi

Untuk kemudahan yang lebih baik, anda boleh mencipta fungsi pembungkus yang mengambil fungsi sebenar sebagai input dan menguruskan proses pemulihan panik. Fungsi pembalut ini boleh digunakan seperti berikut:

func wrap(f func()) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Caught:", r)
        }
    }()

    f()
}
Salin selepas log masuk

Menggunakan pembalut ini memudahkan lagi proses pengendalian panik:

go wrap(func() {
    panic("catch me")
})
Salin selepas log masuk

Pertimbangan Tambahan

Kod contoh yang disediakan menunjukkan situasi di mana goroutine dilancarkan dalam fungsi wrap(). Ini membolehkan pemanggil menentukan sama ada goroutine baharu diperlukan dengan mendahului panggilan wrap() dengan kata kunci pergi. Walau bagaimanapun, fungsi wrap() juga boleh digunakan untuk melindungi pelaksanaan fungsi arbitrari yang diluluskan sebagai input, walaupun anda tidak mahu menjalankannya serentak dalam goroutine baharu.

Atas ialah kandungan terperinci Bagaimana Saya Boleh Pulih daripada Panik dalam Go Goroutines?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan