Ответ
Да, это основа обработки ошибок в современном 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 опасные места, создавай свои классы ошибок для ясности и используй методы исключений, чтобы не гадать на кофейной гуще. И будет тебе счастье, а не хиросима в продакшене.