Работали ли вы с классом Exception и механизмом исключений в PHP?

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

Ответ

Да, это основа обработки ошибок в современном PHP. Механизм исключений позволяет отделить нормальный поток выполнения от обработки ошибок, делая код чище.

Базовое использование:

try {
    $file = fopen('important.txt', 'r');
    if (!$file) {
        throw new Exception('Не удалось открыть файл для чтения.');
    }
    // Работа с файлом...
} catch (Exception $e) {
    // Логируем и/или показываем пользователю понятное сообщение
    error_log('File error: ' . $e->getMessage());
    echo 'Произошла ошибка при обработке файла.';
}

Создание собственных (кастомных) исключений — это лучшая практика для семантической группировки ошибок:

class ValidationException extends InvalidArgumentException {}
class FileNotFoundException extends RuntimeException {}
class ApiConnectionException extends RuntimeException {
    public function __construct(string $url, int $code = 0, Throwable $previous = null) {
        parent::__construct("Не удалось подключиться к API: $url", $code, $previous);
    }
}

// Использование:
try {
    if (!$user->isValid()) {
        throw new ValidationException('Некорректные данные пользователя');
    }
} catch (ValidationException $e) {
    // Обработка именно ошибки валидации
}

Ключевые методы класса Exception (и его родителя Throwable), которые я часто использую для отладки и логирования:

  • getMessage() — сообщение об ошибке.
  • getCode() — числовой код исключения.
  • getFile() и getLine() — где было выброшено исключение.
  • getTrace() и getTraceAsString() — стек вызовов.

Начиная с PHP 7, появился тип Throwable (интерфейс, который реализуют и Exception, и Error), что позволяет ловить как исключения, так и фатальные ошибки (через Error).