errors

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 15, 2025 License: MIT Imports: 4 Imported by: 0

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

View Source
const (
	// Успешные коды
	StatusOK        = http.StatusOK        // 200
	StatusCreated   = http.StatusCreated   // 201
	StatusAccepted  = http.StatusAccepted  // 202
	StatusNoContent = http.StatusNoContent // 204

	// Коды клиентских ошибок
	StatusBadRequest          = http.StatusBadRequest          // 400
	StatusUnauthorized        = http.StatusUnauthorized        // 401
	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
	StatusServiceUnavailable  = http.StatusServiceUnavailable  // 503
	StatusGatewayTimeout      = http.StatusGatewayTimeout      // 504
)

Константы HTTP-статусов, дублирующие http.Status* для удобства Используйте эти константы для создания ошибок с правильными HTTP-кодами

Variables

View Source
var (
	// 400 Bad Request - неверный запрос
	ErrBadRequest = Error{
		Status:  "ERROR",
		Message: "Invalid request format",
		Code:    StatusBadRequest,
	}

	// 401 Unauthorized - не авторизован
	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,
	}

	// 503 Service Unavailable - сервис недоступен
	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

func As(err error, target interface{}) bool

As прокси для errors.As стандартной библиотеки Позволяет преобразовывать ошибку в определенный тип

func HandleHTTPResponse

func HandleHTTPResponse(w http.ResponseWriter, err error)

HandleHTTPResponse записывает ошибку в HTTP-ответ

func Is

func Is(err, target error) bool

Is прокси для errors.Is стандартной библиотеки Позволяет проверять, является ли ошибка (или ее причина) целевой ошибкой

func New

func New(text string) error

New прокси для errors.New стандартной библиотеки Создает простую ошибку без дополнительных полей

func ToHTTPError

func ToHTTPError(err error) (int, string)

ToHTTPError конвертирует ошибку в HTTP статус-код и сообщение

func Unwrap

func Unwrap(err error) error

Unwrap прокси для errors.Unwrap стандартной библиотеки

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 NewError

func NewError(code int, message string, cause error) Error

NewError создаёт новую ошибку с заданным кодом, сообщением и причиной

func Wrap

func Wrap(err error, code int, message string) Error

Wrap создаёт новую ошибку, обертывающую существующую, с указанным кодом и сообщением Совместимо с errors.Unwrap()

func (Error) Error

func (e Error) Error() string

Error реализует интерфейс error

func (Error) Is

func (e Error) Is(target error) bool

Is позволяет использовать errors.Is для сравнения с предопределенными ошибками

func (Error) StandardError

func (e Error) StandardError() error

StandardError возвращает стандартную ошибку Go из нашей ошибки Полезно для случаев, когда нужна чистая ошибка без дополнительных полей

func (Error) Unwrap

func (e Error) Unwrap() error

Unwrap реализует интерфейс обертывания ошибок для поддержки errors.Is/errors.As стандартной библиотеки

func (Error) WithError

func (e Error) WithError(err error) Error

WithError возвращает копию ошибки с присоединенной исходной ошибкой

func (Error) WithMessage

func (e Error) WithMessage(message string) Error

WithMessage возвращает копию ошибки с измененным сообщением

type HTTPResponse

type HTTPResponse struct {
	Status  string      `json:"status"`         // OK или ERROR
	Message string      `json:"message"`        // Сообщение об ошибке или успехе
	Data    interface{} `json:"data,omitempty"` // Опциональные данные
}

HTTPResponse представляет стандартизированный ответ API

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL