Utiliser la panique pour gérer les erreurs dans le middleware Gin

Table des matières

arrière-plan

accomplir

Résumer


arrière-plan

Dans le framework Gin, la gestion des erreurs et la gestion de la panique sont des fonctions très importantes. Lors du traitement des requêtes HTTP, diverses erreurs peuvent se produire, telles que des erreurs de connexion à la base de données, des erreurs réseau, des problèmes d'autorisation, etc. Lorsque nous traitons ces erreurs, nous devons disposer d'un moyen efficace de les détecter et de les gérer. Dans cet article, nous expliquerons comment utiliser à la fois la gestion des erreurs et la gestion de la panique dans Gin.

accomplir

Tout d'abord, regardons la gestion des erreurs dans Gin. Dans Gin, vous pouvez utiliser c.Errorla fonction pour c.Errorsajouter des messages d'erreur aux tranches. c.ErrorsChaque élément de la tranche est un gin.Errorobjet , qui contient des informations sur l'erreur et des informations sur le contexte de l'erreur, telles que la méthode de requête, le chemin, les paramètres de requête, etc. Lorsque la demande est traitée, vous pouvez vérifier c.Errorsla tranche pour toute erreur. S'il y a une erreur, vous pouvez la convertir en une réponse HTTP appropriée afin que le client puisse comprendre ce qui n'a pas fonctionné.

Voici un exemple de code :

func main() {
    r := gin.Default()

    r.GET("/hello", func(c *gin.Context) {
        // 模拟发生一个错误
        c.Error(errors.New("oops! something went wrong"))
        c.String(http.StatusOK, "Hello, World!")
    })

    r.Use(func(c *gin.Context) {
        c.Next()
        if len(c.Errors) > 0 {
            fmt.Println(c.Errors)
            c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal Server Error"})
        }
    })

    r.Run(":8080")
}

Dans cet exemple, nous définissons une /helloroute qui c.Errorsajoute une erreur lors du traitement de la requête. Nous définissons ensuite une fonction middleware qui vérifie c.Errorsla tranche . S'il y a eu une erreur, il affichera un message d'erreur et renverra une réponse JSON avec un message d'erreur "Internal Server Error".

En plus de la gestion des erreurs, la gestion de la panique est également une fonctionnalité importante de Gin. Lorsqu'une panique se produit, Gin renverra une réponse HTTP avec un code d'erreur 500 et un message d'erreur "Internal Server Error" au client par défaut. Cependant, un tel traitement par défaut peut exposer les informations internes du serveur, nous devons donc personnaliser le traitement de la panique.

Dans Gin, vous pouvez utiliser recoverdes fonctions pour attraper les paniques, puis effectuer des actions personnalisées. Voici un exemple de code :

func main() {
    r := gin.Default()

    r.GET("/panic", func(c *gin.Context) {
        panic("Oops! Something went wrong")
    })

    r.Use(func(c *gin.Context) {
        defer func() {
            if err := recover(); err != nil {
                fmt.Println(err)
                c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal Server Error"})
            }
        }()
        c.Next()
    })

    r.Run(":8080")
}

Dans cet exemple, nous définissons une /panicroute qui va paniquer. Ensuite, nous définissons une fonction middleware qui intercepte la panique à l'aide deferde l'instruction et génère les informations de panique. Il renvoie ensuite une réponse JSON avec un message d'erreur "Internal Server Error". Utilisez deferl'instruction pour vous assurer que le code de nettoyage de la fonction middleware est également exécuté lorsque la panique se produit.

Bien sûr, l'utilisation de la gestion des erreurs et de la gestion de la panique dans Gin ne se limite pas à ajouter du code à vos gestionnaires de route et à vos fonctions middleware. Plus important encore, nous devons comprendre quand utiliser la gestion des erreurs et la gestion de la panique, et comment les utiliser ensemble pour améliorer la lisibilité et la maintenabilité du code. Voici un exemple de gestion des erreurs Gin et d'intergiciel captant les paniques :

func panicOnError(err error) {
    if err != nil {
        panic(err)
    }
}

func ErrorHandler() gin.HandlerFunc {
    return func(c *gin.Context) {
        defer func() {
            if err := recover(); err != nil {
                c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "Internal Server Error"})
            }
        }()
        c.Next()
        if len(c.Errors) > 0 {
            panicOnError(c.Errors[0].Err)
        }
    }
}

func main() {
    r := gin.Default()

    r.GET("/hello", func(c *gin.Context) {
        // 模拟发生一个错误
        c.Error(errors.New("oops! something went wrong"))
        c.String(http.StatusOK, "Hello, World!")
    })

    r.Use(ErrorHandler())

    r.Run(":8080")
}

Résumer

En résumé, il est très important d'utiliser la gestion des erreurs et la gestion des paniques dans Gin. En les utilisant correctement, nous pouvons nous assurer que notre application peut gérer correctement diverses erreurs lorsqu'elle les rencontre et renvoyer les réponses HTTP appropriées au client. J'espère que cet article vous sera utile. Si vous avez des questions ou des suggestions, n'hésitez pas à laisser un message dans l'espace commentaire, merci !

Je suppose que tu aimes

Origine blog.csdn.net/kingu_crimson/article/details/129948435
conseillé
Classement