Documentation
¶
Overview ¶
Package errors предоставляет расширенную обработку ошибок для HTTP API и микросервисов, совместимую со стандартным пакетом errors Go 1.13+.
Пакет расширяет стандартную модель ошибок Go, добавляя структурированные данные для HTTP статус-кодов, JSON-представления и системы сообщений.
Полная совместимость со стандартным пакетом errors:
- Поддержка errors.Is и errors.As для проверки и преобразования ошибок
- Поддержка errors.Unwrap для разворачивания вложенных ошибок
- Проксирование стандартных функций errors для плавной интеграции
Дополнительные возможности:
- Стандартизированные HTTP-коды состояния и связанные с ними ошибки
- Структурированные JSON-ответы для API
- Предопределенные типовые ошибки, готовые к использованию
- Вспомогательные функции для обработки HTTP-ошибок в веб-обработчиках
- Интеграция с фреймворком Fiber через middleware
- Поддержка структурированного логирования с Fiber Logger
Примеры использования:
// 1. Создание новой ошибки с HTTP-кодом
err := errors.NewError(errors.StatusBadRequest, "Неверный формат JSON", nil)
// 2. Использование предопределенной ошибки
err := errors.ErrNotFound
// 3. Кастомизация сообщения
err := errors.ErrNotFound.WithMessage("Пользователь с ID 123 не найден")
// 4. Оборачивание ошибки из другой библиотеки
dbErr := db.Query("SELECT * FROM users")
if dbErr != nil {
return errors.Wrap(dbErr, errors.StatusInternalServerError, "Ошибка базы данных")
}
// 5. Использование стандартного errors.Is для проверки наших ошибок
if errors.Is(err, errors.ErrNotFound) {
// Обработка ошибки "не найдено"
}
// 6. Использование стандартного errors.As для приведения типа
var myErr errors.Error
if errors.As(err, &myErr) {
fmt.Printf("HTTP код: %d\n", myErr.Code)
}
// 7. Обработка ошибки в HTTP-хендлере
func HandleRequest(w http.ResponseWriter, r *http.Request) {
err := processRequest(r)
if err != nil {
errors.HandleHTTPResponse(w, err)
return
}
// Успешный ответ
errors.WriteSuccessResponse(w, result)
}
// 8. Использование с Fiber через middleware
app := fiber.New()
app.Use(func(c *fiber.Ctx) error {
err := c.Next()
if err != nil {
var customErr errors.Error
if errors.As(err, &customErr) {
return c.Status(customErr.Code).JSON(fiber.Map{
"status": customErr.Status,
"message": customErr.Message,
})
}
return c.Status(500).JSON(fiber.Map{
"status": "ERROR",
"message": err.Error(),
})
}
return nil
})
// 9. Интеграция с Fiber Logger для структурированного логирования
import "github.com/gofiber/fiber/v2/log"
// Логирование ошибки с использованием Fiber Logger
var customErr errors.Error
if errors.As(err, &customErr) {
log.Errorw(customErr.Message,
"statusCode", customErr.Code,
"service", "UserService",
"errorChain", formatErrorChain(customErr.Unwrap()))
}
// 10. Работа с цепочками ошибок для отладки
baseErr := stderrors.New("connection timeout")
dbErr := errors.Wrap(baseErr, errors.StatusServiceUnavailable, "Ошибка БД")
serviceErr := errors.Wrap(dbErr, errors.StatusInternalServerError, "Ошибка сервиса")
cause := serviceErr
for cause != nil {
fmt.Printf("-> %v\n", cause)
cause = errors.Unwrap(cause)
}
Index ¶
- Constants
- Variables
- func As(err error, target interface{}) bool
- func HandleHTTPResponse(w http.ResponseWriter, err error)
- func Is(err, target error) bool
- func New(text string) error
- func ToHTTPError(err error) (int, string)
- func Unwrap(err error) error
- func WriteSuccessResponse(w http.ResponseWriter, data interface{}, statusCode ...int)
- type Error
- type HTTPResponse
Constants ¶
const ( // Успешные коды StatusOK = http.StatusOK // 200 StatusCreated = http.StatusCreated // 201 StatusAccepted = http.StatusAccepted // 202 StatusNoContent = http.StatusNoContent // 204 // Коды клиентских ошибок StatusBadRequest = http.StatusBadRequest // 400 StatusForbidden = http.StatusForbidden // 403 StatusNotFound = http.StatusNotFound // 404 StatusMethodNotAllowed = http.StatusMethodNotAllowed // 405 StatusConflict = http.StatusConflict // 409 StatusGone = http.StatusGone // 410 StatusUnprocessableEntity = http.StatusUnprocessableEntity // 422 StatusTooManyRequests = http.StatusTooManyRequests // 429 // Коды серверных ошибок StatusInternalServerError = http.StatusInternalServerError // 500 StatusNotImplemented = http.StatusNotImplemented // 501 StatusBadGateway = http.StatusBadGateway // 502 StatusGatewayTimeout = http.StatusGatewayTimeout // 504 )
Константы HTTP-статусов, дублирующие http.Status* для удобства Используйте эти константы для создания ошибок с правильными HTTP-кодами
Variables ¶
var ( // 400 Bad Request - неверный запрос ErrBadRequest = Error{ Status: "ERROR", Message: "Invalid request format", Code: StatusBadRequest, } ErrUnauthorized = Error{ Status: "ERROR", Message: "Unauthorized", Code: StatusUnauthorized, } // 403 Forbidden - запрещено ErrForbidden = Error{ Status: "ERROR", Message: "Forbidden", Code: StatusForbidden, } // 404 Not Found - не найдено ErrNotFound = Error{ Status: "ERROR", Message: "Resource not found", Code: StatusNotFound, } // 405 Method Not Allowed - метод не разрешен ErrMethodNotAllowed = Error{ Status: "ERROR", Message: "Method not allowed", Code: StatusMethodNotAllowed, } // 409 Conflict - конфликт ErrConflict = Error{ Status: "ERROR", Message: "Resource conflict", Code: StatusConflict, } // 422 Unprocessable Entity - невозможно обработать ErrUnprocessableEntity = Error{ Status: "ERROR", Message: "Unprocessable entity", Code: StatusUnprocessableEntity, } // 429 Too Many Requests - слишком много запросов ErrTooManyRequests = Error{ Status: "ERROR", Message: "Too many requests", Code: StatusTooManyRequests, } // 500 Internal Server Error - внутренняя ошибка сервера ErrInternal = Error{ Status: "ERROR", Message: "Internal server error", Code: StatusInternalServerError, } // 501 Not Implemented - не реализовано ErrNotImplemented = Error{ Status: "ERROR", Message: "Not implemented", Code: StatusNotImplemented, } // 502 Bad Gateway - ошибка шлюза ErrExternalService = Error{ Status: "ERROR", Message: "External service error", Code: StatusBadGateway, } ErrServiceUnavailable = Error{ Status: "ERROR", Message: "Service unavailable", Code: StatusServiceUnavailable, } // 504 Gateway Timeout - таймаут шлюза ErrGatewayTimeout = Error{ Status: "ERROR", Message: "Gateway timeout", Code: StatusGatewayTimeout, } )
Предопределенные ошибки для типичных HTTP сценариев
Functions ¶
func As ¶
As прокси для errors.As стандартной библиотеки Позволяет преобразовывать ошибку в определенный тип
func HandleHTTPResponse ¶
func HandleHTTPResponse(w http.ResponseWriter, err error)
HandleHTTPResponse записывает ошибку в HTTP-ответ
func Is ¶
Is прокси для errors.Is стандартной библиотеки Позволяет проверять, является ли ошибка (или ее причина) целевой ошибкой
func New ¶
New прокси для errors.New стандартной библиотеки Создает простую ошибку без дополнительных полей
func ToHTTPError ¶
ToHTTPError конвертирует ошибку в HTTP статус-код и сообщение
func WriteSuccessResponse ¶
func WriteSuccessResponse(w http.ResponseWriter, data interface{}, statusCode ...int)
WriteSuccessResponse записывает успешный JSON-ответ с указанными данными
Types ¶
type Error ¶
type Error struct {
Status string `json:"status"` // Статус ошибки для JSON-ответов
Message string `json:"message"` // Сообщение об ошибке
Code int `json:"-"` // HTTP статус код, не отображается в JSON
// contains filtered or unexported fields
}
Error представляет собой расширенную ошибку со стандартизированными полями для HTTP API
func Wrap ¶
Wrap создаёт новую ошибку, обертывающую существующую, с указанным кодом и сообщением Совместимо с errors.Unwrap()
func (Error) StandardError ¶
StandardError возвращает стандартную ошибку Go из нашей ошибки Полезно для случаев, когда нужна чистая ошибка без дополнительных полей
func (Error) Unwrap ¶
Unwrap реализует интерфейс обертывания ошибок для поддержки errors.Is/errors.As стандартной библиотеки
func (Error) WithMessage ¶
WithMessage возвращает копию ошибки с измененным сообщением
type HTTPResponse ¶
type HTTPResponse struct {
Status string `json:"status"` // OK или ERROR
Message string `json:"message"` // Сообщение об ошибке или успехе
Data interface{} `json:"data,omitempty"` // Опциональные данные
}
HTTPResponse представляет стандартизированный ответ API