Ключевое слово 'throw'
Часть раздела Логика и управление потоком путешествия по C++ на Coddy. Урок 50 из 56.
Иногда нужно сообщить об ошибке в собственном коде, а не просто перехватывать исключения, возникшие в других функциях. Ключевое слово throw позволяет вручную вызвать исключение, когда программа обнаруживает проблему.
В качестве исключений можно выбрасывать значения разных типов — целые числа, строки или даже пользовательские объекты. Вот базовый синтаксис:
if (someErrorCondition) {
throw "Error message"; // Выбрасывает строковый литерал
}Когда ты используешь throw, программа немедленно прекращает выполнение текущей функции и ищет блок catch, который может обработать выброшенное значение. Это особенно полезно для проверки входных данных или условий, которые не должны возникать при обычном выполнении программы.
Вот практический пример генерации исключения при обнаружении некорректного ввода:
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
std::cout << "Age is valid: " << age << std::endl;
}Вызывающий код оборачивает вызов в блок try. Брошенный строковый литерал имеет тип const char*, поэтому именно этот тип указывается в блоке catch, а его параметр содержит сообщение:
try {
checkAge(-5);
} catch (const char* message) {
std::cout << "Error: " << message << std::endl;
}
// Вывод: Error: Age cannot be negative!Ключевое слово throw позволяет контролировать, когда и как сообщать об ошибках в ваших программах, делая функции более надёжными и предсказуемыми при обработке недопустимых условий.
Задание
ЛегкоСоздай программу, которая реализует проверку входных данных с помощью ключевого слова throw, чтобы вручную вызывать исключения при обнаружении недопустимых условий. Это задание проверит, понимаешь ли ты, как использовать throw для сообщения об ошибках в собственных функциях.
Будут предоставлены следующие входные данные:
- Строка
username, представляющая выбранное пользователем имя (эта строка может быть пустой) - Целое число
age, представляющее возраст пользователя
Твоя программа должна:
- Создать функцию с именем
validateUser, которая принимает строку и целое число в качестве параметров - Внутри функции проверить, пусто ли имя пользователя (имеет ли длину 0)
- Если имя пользователя пусто, выполнить
throwсо строкой"Username cannot be empty" - Проверить, меньше ли возраст 13
- Если возраст меньше 13, выполнить
throwсо строкой"Age must be at least 13" - Если обе проверки пройдены, вывести
"User validation successful" - В главной функции вызвать
validateUserс входными значениями - Использовать блок
tryдля вызова функции и блокcatchдля обработки любых выброшенных строковых исключений
Используй следующий точный формат вывода:
При успешной проверке:
User validation successfulПри ошибках проверки:
Validation error: [error_message]Помни: когда ты используешь throw, программа немедленно прекращает выполнение текущей функции и ищет подходящий блок catch. В блоке catch следует указать тип const char*, чтобы обработать выброшенные строковые литералы. Если первая проверка не пройдена, функция выбросит исключение и не продолжит проверку второго условия.
Попробуйте сами
#include <iostream>
#include <string>
using namespace std;
// TODO: Напишите здесь функцию validateUser, перед main
// Она принимает string username и int age и выбрасывает строковый литерал, если проверка не пройдена
int main() {
// Считайте входные данные
string username;
int age;
getline(cin, username);
cin >> age;
// TODO: Вызовите validateUser внутри блока try
// и перехватите выброшенное сообщение с помощью catch (const char* error)
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров8Основы обработки ошибок
Введение в исключенияБлоки 'try' и 'catch'Ключевое слово 'throw'Различные типы исключенийУниверсальный обработчикИтоги: Безопасное делениеПотренируйтесь самостоятельно: Онлайн-компилятор C++