Maison >développement back-end >Golang >Comment gérer les exceptions dans Goroutine ?

Comment gérer les exceptions dans Goroutine ?

WBOY
WBOYoriginal
2024-06-05 12:11:57347parcourir

Gestion des exceptions dans Goroutine : utilisez recovery pour obtenir l'exception du point de récupération. Gérez les exceptions dans les instructions defer, telles qu'un message d'erreur imprimable. Cas pratique : vérifiez de manière asynchrone les autorisations d'accès des utilisateurs, capturez les exceptions avec des autorisations insuffisantes et affichez des messages conviviaux aux utilisateurs.

如何在 Goroutine 中处理异常?

Comment gérer les exceptions dans Goroutine ?

En programmation simultanée, les coroutines ou Goroutines sont des threads légers qui s'exécutent indépendamment. Cependant, la gestion des exceptions dans Goroutines n'est pas tout à fait la même que dans les threads traditionnels.

Gestion des exceptions dans Goroutine

Tout d'abord, créons un Goroutine :

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

Go n'attrape pas les exceptions dans Goroutine par défaut. Si Goroutine lève une exception, le programme plantera. Afin de gérer les exceptions, nous devons utiliser la fonction 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

Dans l'instruction defer, nous utilisons recover pour obtenir l'exception à partir du point de récupération et en fonction de la nécessité de le gérer. 🎜🎜🎜Cas pratique : accès à des ressources protégées🎜🎜🎜Supposons que nous ayons une ressource protégée à laquelle seuls les utilisateurs disposant d'autorisations d'accès spécifiques peuvent y accéder. Nous pouvons utiliser Goroutine pour vérifier les autorisations de l'utilisateur de manière asynchrone : 🎜rrreee🎜 Dans cet exemple, Goroutine peut lancer une exception errors.New("No access permission"), ce qui provoquera le crash du programme. En utilisant l'instruction defer et la fonction recover, nous sommes capables de détecter les exceptions et d'afficher un message d'erreur convivial à l'utilisateur. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn