Обработка ошибок

Обеспечение захвата всех ошибок, возникающих при выполнении обработчиков маршрутов и промежуточных обработчиков Fiber, имеет важное значение. Вы должны возвращать их обработчику функции для захвата и обработки Fiber.

  • Пример
app.Get("/", func(c *fiber.Ctx) error {
    // Передайте ошибку в Fiber
    return c.SendFile("file-does-not-exist")
})

По умолчанию Fiber не обрабатывает ошибки паники. Чтобы избежать падения программы Go и восстановиться от любой ошибки паники, возникшей обработчиками в стеке, необходимо включить промежуточное программное обеспечение Recover, как показано ниже:

  • Пример
package main

import (
    "log"

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

func main() {
    app := fiber.New()
	
	// Используйте промежуточное программное обеспечение recover для перехвата ошибок паники
    app.Use(recover.New())

    app.Get("/", func(c *fiber.Ctx) error {
        panic("Эту ошибку паники перехватывает Fiber")
    })

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

Вы можете использовать пользовательскую структуру ошибки Fiber с fiber.NewError() для передачи дополнительных кодов состояния. Передача сообщения является необязательной; если оставить пустым, оно будет установлено по умолчанию на сообщение о коде состояния (например, 404 равно Not Found).

  • Пример
app.Get("/", func(c *fiber.Ctx) error {
    // 503 Сервис недоступен
    return fiber.ErrServiceUnavailable

    // 503 В отпуске!
    return fiber.NewError(fiber.StatusServiceUnavailable, "В отпуске!")
})

Обработчик ошибок по умолчанию

Fiber предоставляет обработчик ошибок по умолчанию. Для стандартных ошибок ответ будет отправлен как 500 Внутренняя ошибка сервера. Если тип ошибки - fiber.Error, ответ будет отправлен с использованием предоставленного кода статуса и сообщения.

  • Пример
// Обработчик ошибок по умолчанию
var DefaultErrorHandler = func(c *fiber.Ctx, err error) error {
    // Код статуса по умолчанию - 500
    code := fiber.StatusInternalServerError

    // Если это *fiber.Error, получите пользовательский код статуса
    var e *fiber.Error
    if errors.As(err, &e) {
        code = e.Code
    }

    // Установить Content-Type: text/plain; charset=utf-8
    c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)

    // Вернуть код статуса и сообщение об ошибке
    return c.Status(code).SendString(err.Error())
}

Пользовательский обработчик ошибок

Вы можете установить пользовательский обработчик ошибок при инициализации экземпляра Fiber с использованием Config.

В большинстве случаев по умолчанию обработчик ошибок должен быть достаточным. Однако, если вы хотите перехватывать различные типы ошибок и выполнять соответствующие действия, такие как отправка уведомлений по электронной почте или регистрация ошибок в централизованной системе, то пользовательский обработчик ошибок будет очень полезен. Вы также можете отправлять пользовательские ответы клиенту, такие как страницы ошибок или просто JSON-ответы.

Приведенный ниже пример показывает, как отображать страницы ошибок для различных типов ошибок.

  • Пример
// Создайте новый экземпляр Fiber с пользовательской конфигурацией
app := fiber.New(fiber.Config{
    // Переопределить обработчик ошибок по умолчанию
    ErrorHandler: func(ctx *fiber.Ctx, err error) error {
        // Код статуса по умолчанию - 500
        code := fiber.StatusInternalServerError

        // Если это *fiber.Error, получите пользовательский код статуса
        var e *fiber.Error
        if errors.As(err, &e) {
            code = e.Code
        }

        // Отправить пользовательскую страницу ошибки
        err = ctx.Status(code).SendFile(fmt.Sprintf("./%d.html", code))
        if err != nil {
            // Если SendFile не удалось
            return ctx.Status(fiber.StatusInternalServerError).SendString("Внутренняя ошибка сервера")
        }

        // Вернуться из обработчика
        return nil
    },
})

// ...