Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengendalikan pengecualian dalam Goroutine?

Bagaimana untuk mengendalikan pengecualian dalam Goroutine?

WBOY
WBOYasal
2024-06-05 12:11:57279semak imbas

Mengendalikan pengecualian dalam Goroutine: Gunakan pulih untuk mendapatkan pengecualian dari titik pemulihan. Mengendalikan pengecualian dalam penyata tangguh, seperti mesej ralat mesra cetak. Kes praktikal: Semak kebenaran akses pengguna secara tak segerak dan tangkap pengecualian dengan kebenaran yang tidak mencukupi, dan paparkan mesej mesra kepada pengguna.

如何在 Goroutine 中处理异常?

Bagaimana untuk mengendalikan pengecualian dalam Goroutine?

Dalam pengaturcaraan serentak, coroutine atau Goroutine ialah utas ringan yang dilaksanakan secara bebas. Walau bagaimanapun, pengendalian pengecualian dalam Goroutines tidaklah sama seperti benang tradisional.

Mengendalikan Pengecualian dalam Goroutine

Mula-mula, mari buat Goroutine:

func main() {
    go func() {
        // 可能会抛出异常的代码
    }()
}

Go tidak menangkap pengecualian dalam Goroutine secara lalai. Jika Goroutine melemparkan pengecualian, program akan ranap. Untuk mengendalikan pengecualian, kita perlu menggunakan fungsi recover: recover 函数:

func main() {
    go func() {
        defer func() {
            if r := recover(); r != nil {
                // 处理异常
                fmt.Println("捕获到异常:", r)
            }
        }()
    }()
}

defer 语句的内部,我们使用 recover 从恢复点获取异常并根据需要处理它。

实战案例:访问受保护资源

假设我们有一个受保护的资源,只有具有特定访问权限的用户才能访问它。我们可以使用 Goroutine 来异步检查用户的权限:

func checkAccess(userId int) error {
    user, err := getUserByID(userId)
    if err != nil {
        return err
    }
    
    if user.accessLevel != ADMIN {
        return errors.New("没有访问权限")
    }
    
    return nil
}

func main() {
    userIDs := []int{1, 2, 3}
    
    for _, id := range userIDs {
        go func(userId int) {
            if err := checkAccess(userId); err != nil {
                defer func() {
                    if r := recover(); r != nil {
                        // 处理异常:权限不足
                        fmt.Println("用户", userId, ": 权限不足")
                    }
                }()
                panic(err)
            }
            fmt.Println("用户", userId, ": 有访问权限")
        }(id)
    }
}

在这个示例中,Goroutine 可能会抛出 errors.New("没有访问权限") 异常,这将导致程序崩溃。通过使用 defer 语句和 recoverrrreee

Di dalam pernyataan tunda, kami menggunakan recover untuk mendapatkan pengecualian dari titik pemulihan dan berdasarkan Keperluan untuk menanganinya. 🎜🎜🎜Kes Praktikal: Mengakses Sumber Dilindungi🎜🎜🎜Andaikan kita mempunyai sumber yang dilindungi yang hanya pengguna yang mempunyai kebenaran akses tertentu boleh mengaksesnya. Kami boleh menggunakan Goroutine untuk menyemak kebenaran pengguna secara tak segerak: 🎜rrreee🎜 Dalam contoh ini, Goroutine mungkin membuang errors.New("No access permission") pengecualian, yang akan menyebabkan program ranap. Dengan menggunakan pernyataan tunda dan fungsi recover, kami dapat menangkap pengecualian dan memaparkan mesej ralat mesra kepada pengguna. 🎜

Atas ialah kandungan terperinci Bagaimana untuk mengendalikan pengecualian dalam Goroutine?. 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