Что такое оператор throw в PHP?

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

Ответ

В PHP throw — это оператор, используемый для выброса исключения. Исключение — это объект, сигнализирующий о возникновении ошибки или нестандартной ситуации, которая прерывает нормальный ход выполнения программы. Управление передается ближайшему подходящему блоку catch.

Базовый синтаксис:

throw new Exception('Сообщение об ошибке');

Практический пример с пользовательским исключением:

// 1. Определяем собственный класс исключения для предметной области
class InvalidUserCredentialsException extends Exception {}
class UserNotFoundException extends Exception {}

class AuthService {
    private $userRepository;

    public function login(string $email, string $password): User {
        // 2. Выбрасываем исключение при нарушении бизнес-правила
        $user = $this->userRepository->findByEmail($email);
        if (!$user) {
            throw new UserNotFoundException("Пользователь с email $email не найден.");
        }

        if (!password_verify($password, $user->getPasswordHash())) {
            throw new InvalidUserCredentialsException("Неверный пароль.");
        }

        // Логика успешного входа...
        return $user;
    }
}

// 3. Обрабатываем исключения на более высоком уровне (например, в контроллере)
try {
    $authService = new AuthService();
    $user = $authService->login($_POST['email'], $_POST['password']);
    echo "Добро пожаловать, " . $user->getName();
} catch (UserNotFoundException $e) {
    http_response_code(404);
    echo "Ошибка: " . $e->getMessage();
} catch (InvalidUserCredentialsException $e) {
    http_response_code(401);
    echo "Ошибка: " . $e->getMessage();
} catch (Exception $e) {
    // Общий обработчик для всех непредвиденных исключений
    http_response_code(500);
    error_log($e->getMessage()); // Логируем для разработчика
    echo "Произошла внутренняя ошибка сервера.";
}

Ключевые преимущества использования throw:

  • Разделение ответственности: Код, обнаруживающий ошибку, и код, обрабатывающий ее, разделены.
  • Группировка ошибок: Исключения можно организовывать в иерархии классов.
  • Гарантия обработки: Непойманное исключение приведет к фатальной ошибке, что помогает избежать молчаливого продолжения работы с неверным состоянием.
  • Богатый контекст: Объект исключения может содержать сообщение, код ошибки, стек вызовов и другие данные для отладки.