Menu
Coddy logo textTech

Универсальный обработчик

Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 52 из 56.

Иногда ваша программа может столкнуться с непредвиденными ошибками, которые не подпадают под конкретные типы исключений, которые вы запланировали. Универсальный обработчик catch(...) обеспечивает страховку, перехватывая любое исключение, которое не было обработано вашими более специфичными блоками catch.

Универсальный обработчик использует троеточие (...) вместо указания конкретного типа исключения. Он должен располагаться после всех остальных блоков catch, так как C++ проверяет их по порядку:

try {
    // Код, который может генерировать различные исключения
} catch (std::invalid_argument& e) {
    std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
    std::cout << "Number too large!" << std::endl;
} catch (...) {
    std::cout << "An unexpected error occurred!" << std::endl;
}

Универсальный обработчик (catch-all handler) выступает в качестве резервного варианта для любого типа исключения, которое не было перехвачено предыдущими блоками. Это особенно полезно при работе с кодом, который может выбрасывать исключения, которые вы не предусмотрели, гарантируя, что ваша программа не завершится аварийно из-за непредвиденных ошибок.

Хотя вы не можете получить доступ к конкретным деталям исключения в универсальном блоке catch, вы все равно можете вывести общее сообщение об ошибке и выполнить операции по очистке, чтобы ваша программа продолжала работать бесперебойно.

challenge icon

Задание

Легко

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

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

  • Строка testType, представляющая тип выполняемого теста ("string_convert", "math_operation", "array_access" или "unknown_error")
  • Строка value1, которая будет использоваться в качестве основных данных для операции
  • Строка value2, которая будет использоваться в качестве вторичных данных для некоторых операций

Ваша программа должна:

  1. Создать функцию с именем performTest, которая принимает три строковых параметра
  2. Внутри функции использовать структуру if-else для обработки различных типов тестов:
  3. Если testType равен "string_convert": использовать std::stoi для преобразования value1 в целое число и вывести его
  4. Если testType равен "math_operation": преобразовать и value1, и value2 в целые числа с помощью std::stoi, затем разделить value1 на value2 и вывести результат
  5. Если testType равен "array_access": создать строку "Programming", преобразовать value1 в целочисленный индекс с помощью std::stoi, затем использовать str.at(index) для доступа к символу по этому индексу и вывести его. Метод .at() автоматически генерирует исключение std::out_of_range, если индекс недопустим — ручная проверка границ не требуется
  6. Если testType равен "unknown_error": выбросить целочисленное значение 999
  7. В функции main вызвать performTest внутри блока try
  8. Использовать несколько блоков catch для обработки исключений именно в таком порядке:
  9. Первый: std::invalid_argument& для недопустимых преобразований строки в число
  10. Второй: std::out_of_range& для слишком больших чисел или выхода индекса строки за пределы диапазона
  11. Третий: catch(...) в качестве универсального обработчика для любых других типов исключений

Используйте следующий точный формат вывода:

Для успешных операций:

Success: [result_value]

Для различных типов исключений:

Invalid argument caught
Out of range caught
Unknown exception caught

Помните, что универсальный обработчик catch(...) должен располагаться последним, так как C++ проверяет блоки catch по порядку. Этот обработчик перехватит любой тип исключения, который не был обработан предыдущими специфическими блоками catch, включая целочисленное исключение, выброшенное в случае "unknown_error". Универсальный обработчик обеспечивает страховку на случай непредвиденных ошибок, сохраняя при этом возможность специфической обработки известных типов исключений.

Шпаргалка

Универсальный обработчик catch(...) обеспечивает страховку, перехватывая любые исключения, не обработанные конкретными блоками catch.

Универсальный обработчик использует три точки (...) и должен располагаться после всех остальных блоков catch, так как C++ проверяет их по порядку:

try {
    // Код, который может генерировать различные исключения
} catch (std::invalid_argument& e) {
    std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
    std::cout << "Number too large!" << std::endl;
} catch (...) {
    std::cout << "An unexpected error occurred!" << std::endl;
}

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

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

#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;

// TODO: Напишите ваш код здесь - создайте функцию performTest

int main() {
    // Чтение входных данных
    string testType;
    string value1;
    string value2;
    
    cin >> testType;
    cin >> value1;
    cin >> value2;
    
    // TODO: Напишите ваш код ниже - реализуйте блоки try-catch и вызовите performTest
    
    return 0;
}
quiz iconПроверьте себя

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

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