Работали ли вы с классом Exception и механизмом исключений в 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).

Ответ 18+ 🔞

А, ну вот, подъехали к самому соку! Обработка ошибок в PHP — это, блядь, как переходить дорогу: можно по зебре, а можно и под трамвай. Исключения — это та самая зебра, которая отделяет твой рабочий код от всего этого пиздеца, который может случиться.

Базовое использование — проще пареной репы:

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

Смысл в чём? Всё, что может пойти не так, засовываешь в try. Если внутри что-то пошло по пизде — кидаешь исключение throw. А в catch уже сидит твой спасатель, который этот пиздец ловит и делает с ним что надо. Чисто, аккуратно, доверия ебать ноль к окружению, но зато порядок.

А вот создание своих исключений — это уже высший пилотаж. Так делают взрослые дяди, чтобы не путать одно с другим.

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 ты создаёшь ValidationException. И когда ловишь его в catch, ты точно знаешь, что случилось — юзер накосячил, а не сервер упал. Это, блядь, как сортировать мусор: пищевые отходы — в одно ведро, стекло — в другое. Удобно, ёпта!

Теперь про методы класса Exception. Это твой набор отмычек, когда всё уже накрылось медным тазом и нужно понять, что за хуйня произошла.

  • getMessage() — что за ошибка. Базово.
  • getCode() — числовой код, иногда полезно.
  • getFile() и getLine() — святое! Показывает, в каком файле и на какой строчке всё полетело к чертям. Без этого дебажить — это как искать чёрную кошку в тёмной комнате.
  • getTrace() и getTraceAsString() — это уже полная раскладка по стеку вызовов. Кто кого вызывал, пока не приехали в это самое место. Овердохуища полезная штука, когда ошибка глубоко.

И главный лайфхак, с PHP 7: появился тип Throwable. Раньше фатальные ошибки (Fatal Error) ловить было нельзя — привет, белый экран смерти. А теперь можно! Throwable — это такой общий интерфейс, который реализуют и твои Exception, и системные Error. То есть можно написать catch (Throwable $e) и поймать вообще всё, что летит. Эпично, просто ёперный театр!

Короче, суть в чём: не игнорируй исключения. Оборачивай в try-catch опасные места, создавай свои классы ошибок для ясности и используй методы исключений, чтобы не гадать на кофейной гуще. И будет тебе счастье, а не хиросима в продакшене.