Maison > développement back-end > Golang > le corps du texte

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

Barbara Streisand
Libérer: 2024-11-05 03:52:02
original
328 Les gens l'ont consulté

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>
Copier après la connexion

Utilisation du middleware

Enregistrez le middleware ErrorHandler dans la fonction principale :

<code class="go">// ...
router := gin.New()
router.Use(middleware.ErrorHandler)
// ...</code>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!