Gestion des erreurs

Il est crucial de s'assurer que Fiber capture toutes les erreurs survenant lors de l'exécution des gestionnaires de routes et des middleware. Vous devez les renvoyer à la fonction du gestionnaire pour que Fiber les capture et les traite.

  • Exemple
app.Get("/", func(c *fiber.Ctx) error {
    // Transmettre l'erreur à Fiber
    return c.SendFile("file-does-not-exist")
})

Par défaut, Fiber ne gère pas les erreurs de panique. Pour récupérer toute panique générée par les gestionnaires de la pile et éviter de faire planter le programme Go, vous devez inclure le middleware Recover comme indiqué ci-dessous :

  • Exemple
package main

import (
    "log"

    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/recover"
)

func main() {
    app := fiber.New()
    
    // Utiliser le middleware recover pour intercepter les erreurs de panique
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("Cette panique est interceptée par Fiber")
    })

    log.Fatal(app.Listen(":3000"))
}

Vous pouvez utiliser la structure d'erreur personnalisée de Fiber avec fiber.NewError() pour transmettre des codes d'état supplémentaires. Le passage d'un message est facultatif ; s'il est laissé vide, il sera par défaut le message du code d'état (par exemple, 404 équivaut à Non trouvé).

  • Exemple
app.Get("/", func(c *fiber.Ctx) error {
    // 503 Service non disponible
    return fiber.ErrServiceUnavailable

    // 503 En vacances !
    return fiber.NewError(fiber.StatusServiceUnavailable, "En vacances !")
})

Gestionnaire d'erreurs par défaut

Fiber fournit un gestionnaire d'erreurs par défaut. Pour les erreurs standard, la réponse sera envoyée en tant que 500 Erreur interne du serveur. Si le type d'erreur est fiber.Error, la réponse sera envoyée en utilisant le code d'état et le message fournis.

  • Exemple
// Gestionnaire d'erreurs par défaut
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
    // Le code d'état par défaut est 500
    code := fiber.StatusInternalServerError

    // S'il s'agit d'une *fiber.Error, récupérer le code d'état personnalisé
    var e *fiber.Error
    if errors.As(err, &e) {
        code = e.Code
    }

    // Définir le type de contenu : text/plain ; charset=utf-8
    c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)

    // Renvoyer le code d'état et le message d'erreur
    return c.Status(code).SendString(err.Error())
}

Gestionnaire d'erreurs personnalisé

Vous pouvez définir un gestionnaire d'erreurs personnalisé lors de l'initialisation de l'instance Fiber en utilisant Config.

Dans la plupart des cas, le gestionnaire d'erreurs par défaut devrait être suffisant. Cependant, si vous souhaitez intercepter différents types d'erreurs et prendre des mesures correspondantes, telles que l'envoi d'e-mails de notification ou la journalisation des erreurs dans un système centralisé, alors un gestionnaire d'erreurs personnalisé sera très utile. Vous pouvez également envoyer des réponses personnalisées au client, telles que des pages d'erreur ou simplement une réponse JSON.

L'exemple suivant montre comment afficher des pages d'erreur pour différents types d'erreurs.

  • Exemple
// Créer une nouvelle instance Fiber avec une configuration personnalisée
app := fiber.New(fiber.Config{
    // Remplacer le gestionnaire d'erreurs par défaut
    ErrorHandler: func(ctx *fiber.Ctx, err error) error {
        // Le code d'état par défaut est 500
        code := fiber.StatusInternalServerError

        // S'il s'agit d'une *fiber.Error, récupérer le code d'état personnalisé
        var e *fiber.Error
        if errors.As(err, &e) {
            code = e.Code
        }

        // Envoyer une page d'erreur personnalisée
        err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
        if err != nil {
            // Si l'envoi du fichier échoue
            return ctx.Status(fiber.StatusInternalServerError).SendString("Erreur interne du serveur")
        }

        // Renvoyer depuis le gestionnaire
        return nil
    },
})

// ...