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
},
})
// ...