Obsługa błędów

Zabezpieczenie tego, aby Fiber przechwytywał wszystkie błędy, które występują podczas wykonywania obsługiwaczy tras i oprogramowania pośredniczącego, jest kluczowe. Musisz zwrócić je do funkcji obsługującej, aby Fiber mógł je przechwycić i przetworzyć.

  • Przykład
app.Get("/", func(c *fiber.Ctx) error {
    // Przekaż błąd do Fibera
    return c.SendFile("plik-nie-istnieje")
})

Domyślnie Fiber nie obsługuje błędów paniki. Aby odzyskać się z ewentualnej paniki rzucanej przez obsługiwaczy w stosie i uniknąć awarii programu Go, musisz dołączyć oprogramowanie pośredniczące Recover, jak pokazano poniżej:

  • Przykład
package main

import (
    "log"

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

func main() {
    app := fiber.New()

    // Użyj oprogramowania pośredniczącego Recover do przechwytywania błędów paniki
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("Ta panika została przechwycona przez Fibera")
    })

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

Możesz użyć niestandardowej struktury błędu Fibera fiber.NewError() do przekazania dodatkowych kodów stanu. Przekazywanie wiadomości jest opcjonalne; jeśli pozostanie puste, zostanie użyta domyślna wiadomość kodu stanu (np. 404 równa się Nie znaleziono).

  • Przykład
app.Get("/", func(c *fiber.Ctx) error {
    // 503 Serwer niedostępny
    return fiber.ErrServiceUnavailable

    // 503 Na wakacjach!
    return fiber.NewError(fiber.StatusServiceUnavailable, "Na wakacjach!")
})

Domyślny obsługiwacz błędów

Fiber zapewnia domyślny obsługiwacz błędów. Dla standardowych błędów odpowiedź zostanie wysłana jako 500 Internal Server Error. Jeśli typ błędu to fiber.Error, odpowiedź zostanie wysłana z użyciem podanego kodu stanu i wiadomości.

  • Przykład
// Domyślny obsługiwacz błędów
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
    // Domyślny kod stanu to 500
    code := fiber.StatusInternalServerError

    // Jeśli to *fiber.Error, pobierz niestandardowy kod stanu
    var e *fiber.Error
    if errors.As(err, &e) {
        code = e.Code
    }

    // Ustaw Content-Type: text/plain; charset=utf-8
    c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)

    // Zwróć kod stanu i wiadomość błędu
    return c.Status(code).SendString(err.Error())
}

Niestandardowy obsługiwacz błędów

Możesz ustawić niestandardowy obsługiwacz błędów podczas inicjalizacji instancji Fibera za pomocą konfiguracji.

W większości przypadków domyślny obsługiwacz błędów powinien być wystarczający. Jednak jeśli chcesz przechwytywać różne rodzaje błędów i podejmować odpowiednie działania, takie jak wysyłanie powiadomień e-mailowych lub logowanie błędów do scentralizowanego systemu, to niestandardowy obsługiwacz błędów będzie bardzo przydatny. Możesz również wysyłać niestandardowe odpowiedzi do klienta, takie jak strony błędów lub tylko odpowiedź w formacie JSON.

Poniższy przykład pokazuje, jak wyświetlać strony błędów dla różnych rodzajów błędów.

  • Przykład
// Utwórz nową instancję Fibera z niestandardową konfiguracją
app := fiber.New(fiber.Config{
    // Zastąp domyślny obsługiwacz błędów
    ErrorHandler: func(ctx *fiber.Ctx, err error) error {
        // Domyślny kod stanu to 500
        code := fiber.StatusInternalServerError

        // Jeśli to *fiber.Error, pobierz niestandardowy kod stanu
        var e *fiber.Error
        if errors.As(err, &e) {
            code = e.Code
        }

        // Wyślij niestandardową stronę błędu
        err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
        if err != nil {
            // Jeśli SendFile nie powiedzie się
            return ctx.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
        }

        // Powrót z obsługiwacza
        return nil
    },
})

// ...