Генерация исключения
Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 42 из 65.
Иногда вам нужно создавать собственные условия ошибок в коде. Ключевое слово throw позволяет вручную инициировать исключение, когда ваша программа сталкивается с ситуацией, которая не должна позволять продолжение выполнения.
Когда вы выбрасываете (throw) исключение, вы, по сути, говорите: «остановите всё — здесь что-то не так». Это полезно для проверки входных данных или обеспечения соблюдения правил в ваших функциях. Вы можете выбросить простое строковое сообщение или создать более специфические типы исключений.
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
print("Age is valid: $age");
}В этом примере, если кто-то попытается передать отрицательный возраст, функция немедленно выбрасывает исключение с описательным сообщением. Это предотвращает выполнение остальной части функции с некорректными данными, делая ваш код более надежным и простым в отладке.
Генерация исключений особенно полезна в функциях, которым необходимо проверять входные данные перед выполнением важных операций.
Задание
ЛегкоСоздайте программу, которая проверяет информацию об учетной записи пользователя, реализуя пользовательские функции валидации, которые выбрасывают исключения при обнаружении недопустимых данных. Ваша программа должна проверять несколько полей учетной записи и выбрасывать определенные сообщения об ошибках для различных сбоев валидации.
- Считайте строковый ввод, представляющий имя пользователя (username)
- Считайте строковый ввод, представляющий адрес электронной почты (email)
- Считайте строковый ввод, представляющий возраст (age) в виде строки
- Считайте строковый ввод, представляющий пароль (password)
- Создайте функцию с именем
validateUsername, которая проверяет, является ли имя пользователя допустимым: - Если имя пользователя пустое или содержит менее 3 символов, выбросьте исключение:
"Username must be at least 3 characters long" - Если имя пользователя содержит пробелы, выбросьте исключение:
"Username cannot contain spaces" - Если валидация прошла успешно, выведите:
"Username validation passed" - Создайте функцию с именем
validateEmail, которая проверяет, является ли адрес электронной почты допустимым: - Если адрес электронной почты не содержит символ
@, выбросьте исключение:"Email must contain @ symbol" - Если адрес электронной почты не содержит точку
.после символа@, выбросьте исключение:"Email must contain a valid domain" - Если валидация прошла успешно, выведите:
"Email validation passed" - Создайте функцию с именем
validateAge, которая проверяет, является ли возраст допустимым: - Преобразуйте строку возраста в целое число с помощью
int.parse() - Если возраст меньше 13, выбросьте исключение:
"Age must be at least 13 years old" - Если возраст больше 120, выбросьте исключение:
"Age must be realistic (under 120)" - Если валидация прошла успешно, выведите:
"Age validation passed" - Создайте функцию с именем
validatePassword, которая проверяет, является ли пароль допустимым: - Если пароль короче 8 символов, выбросьте исключение:
"Password must be at least 8 characters long" - Если валидация прошла успешно, выведите:
"Password validation passed" - Вызовите каждую функцию валидации последовательно и обработайте любые возникшие исключения
- Отобразите результаты в точном формате, показанном ниже
Например, если входные данные — "john", "john@email.com", "25", "password123", ваша программа должна вывести:
Account Validation System
=========================
Validating username: john
Username validation passed
Validating email: john@email.com
Email validation passed
Validating age: 25
Age validation passed
Validating password: password123
Password validation passed
=========================
All validations passed successfully!
Account created for user: johnЕсли входные данные — "jo", "john@email.com", "25", "password123", ваша программа должна вывести:
Account Validation System
=========================
Validating username: jo
Validation Error: Username must be at least 3 characters long
Account creation failed due to validation errorsЕсли входные данные — "john doe", "johnemail.com", "12", "pass", ваша программа должна вывести:
Account Validation System
=========================
Validating username: john doe
Validation Error: Username cannot contain spaces
Account creation failed due to validation errorsВаша программа должна вызывать каждую функцию валидации в строгом порядке: имя пользователя, электронная почта, возраст, затем пароль. Остановите валидацию и выведите сообщение об ошибке, как только любая проверка не удастся. Используйте ключевое слово throw для ручного вызова исключений с конкретными сообщениями об ошибках, указанными выше. Каждая функция валидации должна проверять соответствующее поле и выбрасывать исключение, если проверка не удалась, или выводить сообщение об успехе, если она пройдена.
Шпаргалка
Ключевое слово throw позволяет вам вручную вызывать исключения, когда ваша программа сталкивается с недопустимыми условиями:
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
print("Age is valid: $age");
}Когда вы используете throw для вызова исключения, выполнение программы останавливается в этой точке. Это полезно для проверки входных данных и соблюдения правил в функциях, что делает ваш код более надежным и упрощает отладку.
Вы можете выбрасывать простые строковые сообщения или создавать более специфические типы исключений. Вызов исключений особенно ценен в функциях валидации, которым необходимо проверить входные данные перед выполнением важных операций.
Попробуйте сами
import 'dart:io';
void main() {
// Чтение входных данных
String? username = stdin.readLineSync();
String? email = stdin.readLineSync();
String? age = stdin.readLineSync();
String? password = stdin.readLineSync();
print("Account Validation System");
print("=========================");
try {
// TODO: Создайте функцию validateUsername и вызовите ее здесь
print("Validating username: $username");
// TODO: Создайте функцию validateEmail и вызовите ее здесь
print("Validating email: $email");
// TODO: Создайте функцию validateAge и вызовите ее здесь
print("Validating age: $age");
// TODO: Создайте функцию validatePassword и вызовите ее здесь
print("Validating password: $password");
// TODO: Если все проверки пройдены, выведите сообщения об успехе
print("=========================");
print("All validations passed successfully!");
print("Account created for user: $username");
} catch (e) {
// TODO: Обработайте исключения и выведите сообщение об ошибке
print("Validation Error: $e");
print("Account creation failed due to validation errors");
}
}
// TODO: Напишите ваши функции валидации здесьВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутая работа со списками
Свойства списка: first и lastСостояние списка: isEmpty и isNotEmptyРазворот спискаДобавление в список: insertУдаление из списка: removeWhereПоиск в списке: indexOfСортировка спискаПеремешивание спискаИтоги — Органайзер списков4Продвинутая работа с Map
Итерация по MapПроверка ключей и значенийСвойства Map: keys и valuesУсловное добавление: putIfAbsentУдаление записей из MapВложенные MapИтоги — Обновление инвентаря2Функциональные операции со списками
Преобразование с помощью 'map'Фильтрация с помощью 'where'Использование '.toList()'Проверка условий с помощью 'any'Условия с 'every'Поиск с помощью 'firstWhere'Повторение — фильтрация данных5Проект: Калькулятор корзины
Настройка проектаДобавление товаров в корзину3Множества
Что такое множество?Создание множестваДобавление и удаление элементовПроверка наличия элементов в множествеПреобразование списка в множествоОбъединение множествПересечение множествРазность множествИтоги: уникальный список гостей6Основы обработки ошибок
Что такое исключения?Блок 'try-catch'Перехват исключений с помощью 'on'Блок 'finally'Генерация исключенияИтоги: Безопасное деление