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

// ...