Menu
CoddyTech

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

challenge icon

Задание

Легко

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

Будут предоставлены следующие входные данные:

  • Строка username, представляющая выбранное пользователем имя (эта строка может быть пустой)
  • Целое число age, представляющее возраст пользователя

Твоя программа должна:

  1. Создать функцию с именем validateUser, которая принимает строку и целое число в качестве параметров
  2. Внутри функции проверить, пусто ли имя пользователя (имеет ли длину 0)
  3. Если имя пользователя пусто, выполнить throw со строкой "Username cannot be empty"
  4. Проверить, меньше ли возраст 13
  5. Если возраст меньше 13, выполнить throw со строкой "Age must be at least 13"
  6. Если обе проверки пройдены, вывести "User validation successful"
  7. В главной функции вызвать validateUser с входными значениями
  8. Использовать блок 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;
}
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор C++