Fehlerbehandlung
Die Gewährleistung, dass Fiber alle Fehler, die während der Ausführung von Routen-Handlern und Middleware auftreten, erfasst, ist entscheidend. Diese müssen an die Handler-Funktion zurückgegeben werden, damit Fiber sie erfassen und verarbeiten kann.
- Beispiel
app.Get("/", func(c *fiber.Ctx) error {
// Den Fehler an Fiber übergeben
return c.SendFile("file-does-not-exist")
})
Standardmäßig behandelt Fiber keine Panikfehler. Um sich von einer durch Handler im Stack ausgelösten Panik zu erholen und das Go-Programm nicht zum Absturz zu bringen, muss das Recover
-Middleware wie unten gezeigt integriert werden:
- Beispiel
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
// Verwenden der Recover-Middleware zum Auffangen von Panikfehlern
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("Diese Panik wird von Fiber erfasst")
})
log.Fatal(app.Listen(":3000"))
}
Sie können die benutzerdefinierte Fehlerstruktur von Fiber mit fiber.NewError()
verwenden, um zusätzliche Statuscodes
zu übergeben. Die Weitergabe einer Nachricht ist optional; wenn sie leer gelassen wird, wird sie auf die Statuscode-Nachricht (z. B. 404
entspricht Nicht gefunden
) zurückgesetzt.
- Beispiel
app.Get("/", func(c *fiber.Ctx) error {
// 503 Service nicht verfügbar
return fiber.ErrServiceUnavailable
// 503 Im Urlaub!
return fiber.NewError(fiber.StatusServiceUnavailable, "Im Urlaub!")
})
Standardfehler-Handler
Fiber bietet einen Standardfehler-Handler an. Bei Standardfehlern wird die Antwort als 500 Interner Serverfehler gesendet. Wenn der Fehler vom Typ fiber.Error ist, wird die Antwort unter Verwendung des bereitgestellten Statuscodes und der Nachricht gesendet.
- Beispiel
// Standardfehler-Handler
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
// Standard-Statuscode ist 500
code := fiber.StatusInternalServerError
// Wenn es sich um *fiber.Error handelt, den benutzerdefinierten Statuscode abrufen
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// Content-Type auf text/plain; charset=utf-8 setzen
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
// Statuscode und Fehlermeldung zurückgeben
return c.Status(code).SendString(err.Error())
}
Benutzerdefinierter Fehler-Handler
Sie können beim Initialisieren der Fiber-Instanz mithilfe von Config einen benutzerdefinierten Fehler-Handler festlegen.
In den meisten Fällen sollte der Standardfehler-Handler ausreichen. Wenn Sie jedoch verschiedene Arten von Fehlern erfassen und entsprechende Maßnahmen ergreifen möchten, z. B. das Senden von Benachrichtigungs-E-Mails oder das Protokollieren der Fehler in ein zentrales System, dann ist ein benutzerdefinierter Fehler-Handler sehr nützlich. Sie können auch benutzerdefinierte Antworten an den Client senden, z. B. Fehlerseiten oder nur eine JSON-Antwort.
Das folgende Beispiel zeigt, wie Fehlerseiten für verschiedene Arten von Fehlern angezeigt werden können.
- Beispiel
// Erstellen einer neuen Fiber-Instanz mit benutzerdefinierter Konfiguration
app := fiber.New(fiber.Config{
// Den Standardfehler-Handler überschreiben
ErrorHandler: func(ctx *fiber.Ctx, err error) error {
// Standard-Statuscode ist 500
code := fiber.StatusInternalServerError
// Wenn es sich um *fiber.Error handelt, den benutzerdefinierten Statuscode abrufen
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
// Senden einer benutzerdefinierten Fehlerseite
err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
if err != nil {
// Wenn SendFile fehlschlägt
return ctx.Status(fiber.StatusInternalServerError).SendString("Interner Serverfehler")
}
// Rückkehr vom Handler
return nil
},
})
// ...