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