Разработка на PHP: Как создать класс исключений (Exception) с поддержкой сообщения и уникального слага (slug) для логирования ошибок?

Создание собственного класса исключений в PHP с поддержкой уникального слага (slug) — распространённая практика в профессиональной разработке. Это позволяет структурировать логирование ошибок, быстро идентифицировать их тип и источник без разбора текстовых сообщений.

## Базовая структура класса исключения со слагом

В PHP все исключения наследуются от базового класса `Exception`. Чтобы добавить поддержку слага, достаточно расширить этот класс:

php
slug = $slug;
parent::__construct($message, $code, $previous);
}

public function getSlug(): string
{
return $this->slug;
}

public function __toString(): string
{
return «[{$this->slug}] {$this->getMessage()} (code: {$this->getCode()})»;
}
}

## Использование класса

php
try {
throw new SlugException(
‘Пользователь не найден в базе данных’,
‘user-not-found’,
404
);
} catch (SlugException $e) {
// Логирование с использованием слага
error_log(«[{$e->getSlug()}] » . $e->getMessage());
echo $e; // [user-not-found] Пользователь не найден (code: 404)
}

## Иерархия исключений для разных доменов

Рекомендуется создавать иерархию классов для разных типов ошибок:

php
class DatabaseException extends SlugException {}
class ValidationException extends SlugException {}
class AuthException extends SlugException {}

// Использование
throw new DatabaseException(‘Ошибка подключения’, ‘db-connection-failed’, 500);
throw new ValidationException(‘Поле email обязательно’, ‘validation-email-required’, 422);

## Автогенерация уникального слага

Для обеспечения уникальности можно добавить временную метку или UUID:

php
public static function create(string $message, string $baseSlug): self
{
$uniqueSlug = $baseSlug . ‘-‘ . uniqid();
return new self($message, $uniqueSlug);
}

## Интеграция с логгером (PSR-3)

При использовании PSR-3-совместимого логгера (например, Monolog) слаг удобно передавать в контекст:

php
} catch (SlugException $e) {
$logger->error($e->getMessage(), [
‘slug’ => $e->getSlug(),
‘code’ => $e->getCode(),
‘trace’ => $e->getTraceAsString(),
]);
}

## Лучшие практики

— **Именуйте слаги в kebab-case**: `user-not-found`, `payment-failed`.
— **Используйте префиксы домена**: `auth-token-expired`, `db-query-timeout`.
— **Не меняйте слаги** после публикации — на них могут опираться мониторинговые системы.
— **Документируйте слаги** в отдельном реестре ошибок проекта.

Такой подход значительно упрощает отладку, мониторинг и автоматическую классификацию ошибок в production-среде.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.