Универсальный обработчик
Часть раздела Логика и управление потоком путешествия по 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 нельзя получить конкретные сведения об исключении, вы всё равно можете вывести общее сообщение об ошибке и выполнить операции очистки, чтобы программа продолжала работать без сбоев.
Задание
ЛегкоСоздай программу, демонстрирующую комплексную обработку исключений с помощью нескольких блоков catch, включая обработчик для всех исключений. Это задание проверит, насколько хорошо ты понимаешь, как обрабатывать как конкретные типы исключений, так и непредвиденные ошибки, не относящиеся к заранее определённым категориям.
Будут предоставлены следующие входные данные:
- Строка
testType, представляющая тип выполняемого теста ("string_convert","math_operation","array_access"или"unknown_error") - Строка
value1, которая будет использоваться в качестве основных данных для операции - Строка
value2, которая будет использоваться в качестве дополнительных данных для некоторых операций
Твоя программа должна:
- Создать функцию с именем
performTest, принимающую три строковых параметра - Внутри функции использовать структуру if-else для обработки различных типов тестов:
- Если testType равен
"string_convert": использоватьstd::stoi, чтобы преобразовать value1 в целое число и вывести его - Если testType равен
"math_operation": преобразовать value1 и value2 в целые числа с помощьюstd::stoi, затем разделить value1 на value2 и вывести результат - Если testType равен
"array_access": создать строку"Programming", преобразовать value1 в целочисленный индекс с помощьюstd::stoi, затем использоватьstr.at(index), чтобы получить символ с этим индексом и вывести его. Метод.at()автоматически выбрасывает исключениеstd::out_of_range, если индекс недопустим: вручную проверять границы не нужно - Если testType равен
"unknown_error": выбросить целое значение999 - В функции main вызвать
performTestвнутри блокаtry - Использовать несколько блоков
catchдля обработки исключений строго в следующем порядке: - Первый:
std::invalid_argument&для недопустимых преобразований строки в число - Второй:
std::out_of_range&для слишком больших чисел или выхода индекса строки за границы - Третий:
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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров8Основы обработки ошибок
Введение в исключенияБлоки 'try' и 'catch'Ключевое слово 'throw'Различные типы исключенийУниверсальный обработчикИтоги: Безопасное делениеПотренируйтесь самостоятельно: Онлайн-компилятор C++