Можно ли создавать пользовательские исключения в PHP?

«Можно ли создавать пользовательские исключения в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, создание собственных классов исключений — это лучшая практика для точной обработки ошибок, специфичных для бизнес-логики приложения.

Пример создания и использования:

// Пользовательское исключение для ошибок валидации
class ValidationException extends InvalidArgumentException {
    private array $errors;

    public function __construct(string $message, array $errors = [], int $code = 0, ?Throwable $previous = null) {
        parent::__construct($message, $code, $previous);
        $this->errors = $errors;
    }

    public function getErrors(): array {
        return $this->errors;
    }
}

// Использование в сервисе
class UserRegistrationService {
    public function register(array $data): void {
        $errors = $this->validate($data);
        if (!empty($errors)) {
            throw new ValidationException('Ошибка валидации данных пользователя', $errors);
        }
        // ... логика регистрации
    }
}

// Точечная обработка
try {
    $service->register(['email' => 'invalid']);
} catch (ValidationException $e) {
    echo $e->getMessage();
    foreach ($e->getErrors() as $error) {
        echo "- $errorn";
    }
}

Преимущества:

  • Семантика: Исключения отражают конкретную проблему (ValidationException, PaymentFailedException).
  • Точный перехват: Можно ловить только нужные типы исключений, не обрабатывая все через общий Exception.
  • Дополнительные данные: Класс исключения может содержать специфичную для ошибки информацию (как $errors в примере выше).