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