Обработка ошибок
Обеспечение захвата всех ошибок, возникающих при выполнении обработчиков маршрутов и промежуточных обработчиков 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
},
})
// ...