Menu
CoddyTech

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

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

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

challenge icon

Задание

Легко

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

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

  • Строка 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". Обработчик всех исключений служит страховкой от непредвиденных ошибок, позволяя при этом отдельно обрабатывать известные типы исключений.

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

#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Проверьте себя

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

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

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