Maison  >  Article  >  développement back-end  >  Le middleware Gin peut-il gérer toutes les erreurs HTTP sans instructions « if » répétitives ?

Le middleware Gin peut-il gérer toutes les erreurs HTTP sans instructions « if » répétitives ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-05 03:52:02317parcourir

Can Gin Middleware Handle All HTTP Errors Without Repetitive `if` Statements?

Gestion des erreurs dans le middleware Gin

Question

Dans Gin, est-il possible de gérer toutes les erreurs HTTP sur chaque route sans écrire des instructions if répétitives pour Erreurs 400, 404, 500, etc. ? L'objectif est de capturer et de gérer les erreurs au sein d'une fonction middleware dédiée.

Réponse

Oui, vous pouvez utiliser un middleware pour centraliser la gestion des erreurs, éliminant ainsi le besoin d'instructions if répétitives dans les gestionnaires de routes. Voici comment :

Implémentation du middleware

Créez une fonction middleware appelée ErrorHandler :

<code class="go">func ErrorHandler(c *gin.Context) {
    // Execute remaining handlers
    c.Next()

    // Retrieve and handle errors
    for _, err := range c.Errors {
        // Log, handle, etc.
    }

    // Default handler if no other error is handled
    c.JSON(http.StatusInternalServerError, "")
}</code>

Utilisation du middleware

Enregistrez le middleware ErrorHandler dans la fonction principale :

<code class="go">// ...
router := gin.New()
router.Use(middleware.ErrorHandler)
// ...</code>

Modification du gestionnaire de route

Dans les gestionnaires de route, abandonnez simplement la requête avec l'erreur au lieu d'appeler un gestionnaire d'erreur externe :

<code class="go">func (h *Handler) List(c *gin.Context) {
    movies, err := h.service.ListService()

    if err != nil {
        // Abort the request with the error
        c.AbortWithError(http.StatusInternalServerError, err)
        return
    }

    c.JSON(http.StatusOK, movies)
}</code>

Gestion des erreurs dans le middleware

Dans le middleware ErrorHandler, inspectez les erreurs capturées dans le contexte :

<code class="go">for _, ginErr := range c.Errors {
    switch ginErr.Err {
        case ErrNotFound:
            c.JSON(-1, gin.H{"error": ErrNotFound.Error()})
        // ...
    }
}</code>

Journalisation et personnalisations

Vous pouvez également intégrer la journalisation ou transmettre des arguments personnalisés au middleware comme nécessaire :

<code class="go">func ErrorHandler(logger *zap.Logger) gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Next()
        
        for _, ginErr := range c.Errors {
            logger.Error("whoops", ...)
        }
    }
}</code>

De plus, pensez à ne pas écraser un statut HTTP explicitement défini dans votre gestionnaire d'erreurs en utilisant -1 comme code d'état lors de l'appel de c.JSON.

Erreurs multiples

Vous pouvez utiliser c.Error dans les gestionnaires de routes pour capturer plusieurs erreurs et les gérer collectivement dans le middleware d'erreurs.

Récapitulatif

L'utilisation d'un middleware pour la gestion des erreurs rationalise votre base de code, permet vous permet de personnaliser et d'étendre le processus de gestion des erreurs et fournit un point de contrôle centralisé pour la gestion des erreurs.

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