Menu
Coddy logo textTech

Использование пользовательского исключения

Часть раздела Логика и управление потоком путешествия по PHP на Coddy — урок 57 из 68.

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

Когда вы выбрасываете пользовательское исключение, вы используете то же ключевое слово throw, но создаете экземпляр своего пользовательского класса вместо общего класса Exception. Это делает вашу обработку ошибок более точной и осмысленной.

<?php
class InvalidEmailException extends Exception {}

function validateEmail($email) {
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        throw new InvalidEmailException("Invalid email format: " . $email);
    }
    echo "Email is valid!";
}
?>

Настоящая мощь проявляется при перехвате вашего пользовательского исключения. Вместо того чтобы перехватывать общее Exception, вы можете перехватить ваше конкретное InvalidEmailException. Это позволяет вам обрабатывать различные типы ошибок разными способами, делая вашу обработку ошибок более целенаправленной и информативной.

<?php
try {
    validateEmail("invalid-email");
} catch (InvalidEmailException $e) {
    echo "Email error: " . $e->getMessage();
}
?>

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

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

challenge icon

Задание

Легко

Вы получите три входных значения: строку имени пользователя, строку пароля и число, представляющее минимальную длину пароля. Имя пользователя не должно быть пустым, а пароль должен соответствовать требованию минимальной длины.

Создайте пользовательский класс исключения с именем InvalidCredentialsException, который расширяет базовый класс Exception.

Создайте функцию с именем validateCredentials, которая принимает три параметра: имя пользователя, пароль и минимальную длину. Внутри этой функции:

  • Если имя пользователя пустое (пустая строка), выбросьте исключение InvalidCredentialsException с сообщением "Username cannot be empty"
  • Если длина пароля меньше минимальной длины, выбросьте исключение InvalidCredentialsException с сообщением "Password must be at least X characters long" (где X — значение минимальной длины)
  • Если обе проверки пройдены, выведите "Credentials are valid"

Используйте блок try...catch для вызова функции с предоставленными входными данными. В блоке catch перехватите именно InvalidCredentialsException и выведите "Validation error: ", а затем сообщение об исключении, используя метод getMessage().

Формат входных данных:

  • Первая строка: Строка, представляющая имя пользователя (например, john_doe или пустая строка)
  • Вторая строка: Строка, представляющая пароль (например, pass123)
  • Третья строка: Целое число, представляющее минимальную длину пароля (например, 8)

Ожидаемый вывод:

  • Если учетные данные верны: Credentials are valid
  • Если имя пользователя пустое: Validation error: Username cannot be empty
  • Если пароль слишком короткий: Validation error: Password must be at least X characters long (где X — минимальная длина)

Шпаргалка

Чтобы использовать пользовательские исключения, выбросьте экземпляр вашего пользовательского класса и перехватите этот конкретный тип исключения:

<?php
class InvalidEmailException extends Exception {}

function validateEmail($email) {
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        throw new InvalidEmailException("Invalid email format: " . $email);
    }
    echo "Email is valid!";
}

try {
    validateEmail("invalid-email");
} catch (InvalidEmailException $e) {
    echo "Email error: " . $e->getMessage();
}
?>

Это позволяет обеспечить точную обработку ошибок путем перехвата конкретных типов исключений, а не общих объектов Exception.

Попробуйте сами

<?php
// Чтение входных данных
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$minLength = intval(fgets(STDIN));

// TODO: Напишите ваш код ниже
// 1. Создайте класс InvalidCredentialsException
// 2. Создайте функцию validateCredentials
// 3. Используйте блок try...catch для вызова функции и обработки исключений

?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком