Как работает оператор throw в PHP?

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

Ответ

Оператор throw в PHP используется для явного выброса исключения (exception). Это прерывает нормальное выполнение программы и передает управление первому подходящему блоку catch в стеке вызовов.

Механика работы:

  1. При выполнении throw создается объект исключения (обычно экземпляр класса Exception или его потомка).
  2. Текущий блок кода немедленно прекращает выполнение.
  3. PHP ищет ближайший охватывающий блок try-catch, который может поймать этот тип исключения.
  4. Если подходящий catch найден, выполняется его код, и программа продолжает работу после блока try-catch-finally.
  5. Если подходящий catch не найден, вызывается глобальный обработчик исключений, и скрипт завершается с фатальной ошибкой (Fatal Error).

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

class InvalidUserException extends InvalidArgumentException {
    public function __construct($userId) {
        parent::__construct("User with ID {$userId} is invalid or not found.");
    }
}

function getUserEmail(int $userId): string {
    if ($userId <= 0) {
        // Выбрасываем исключение, прерывая функцию
        throw new InvalidUserException($userId);
    }
    // ... логика поиска пользователя
    return 'user@example.com';
}

try {
    $email = getUserEmail(-5); // Вызовет исключение
    echo $email;
} catch (InvalidUserException $e) {
    // Ловим конкретный тип исключения
    error_log('User error: ' . $e->getMessage());
    echo 'Could not retrieve user.';
} catch (Exception $e) {
    // Ловим любое другое исключение
    echo 'An unexpected error occurred.';
} finally {
    // Этот код выполнится в любом случае
    echo 'Request processed.';
}

Ключевые моменты:

  • В PHP 7+ все исключения реализуют интерфейс Throwable. Есть два основных ветвления: Exception (для ошибок логики приложения) и Error (для критических ошибок движка PHP).
  • Исключения поддерживают вложенность через getPrevious(), что полезно для оборачивания низкоуровневых исключений.
  • Использование throw — основа современной обработки ошибок в PHP, позволяющая отделить код, генерирующий ошибку, от кода, который ее обрабатывает.