C++ Обработка исключений: пример Try, Catch, throw

⚡ Умное резюме

Обработка исключений в C++ Позволяет программе обнаруживать ошибки времени выполнения и реагировать на них с помощью конструкций try, catch и throw, предотвращая сбой. Здесь вы узнаете ключевые слова, синтаксис, стандартные исключения и пользовательские исключения с примерами.

  • ⚠️ Что это: Обработка исключений выявляет ошибки, возникающие во время выполнения, что позволяет программе восстановиться.
  • 🔑 Ключевые слова: В нем используется конструкция try для тестирования кода, throw для генерации исключений и catch для обработки ошибок.
  • 🧾 Синтаксис: Рискованный код следует помещать в блок try, а ошибки обрабатывать в блоках catch.
  • 📚 Стандартные исключения: C++ Предоставляет встроенные исключения в заголовке исключения.
  • 🤖 Помощь ИИ: Инструменты искусственного интеллекта, такие как GitHub Copilot, добавляют блоки try-catch и обработку ошибок.

C++ Обработка исключений

Что такое обработка исключений в C++?

Обработка исключений в C++ предоставляет вам способ обработки непредвиденных обстоятельств, таких как ошибки во время выполнения. Поэтому при возникновении непредвиденных обстоятельств управление программой передается специальным функциям, известным как обработчики.

Чтобы перехватить исключения, вы помещаете какой-то участок кода под проверку исключений. Часть кода помещается в блок try-catch.

Если в этом разделе кода возникает исключительная ситуация, будет выброшено исключение. Далее обработчик исключений возьмет на себя управление программой.

Если не произойдет никаких исключительных обстоятельств, код будет выполняться нормально. Обработчики будут игнорироваться.

В этом C++ учебник, вы узнаете:

Почему обработка исключений?

Вот причина использования обработки исключений в C++:

  • Вы отделите код обработки ошибок от обычного кода. Код станет более читабельным и простым в обслуживании.
  • Функции могут обрабатывать выбранные ими исключения. Даже если функция выдает много исключений, она обработает только некоторые из них. Вызывающий объект будет обрабатывать неперехваченные исключения.

Ключевые слова обработки исключений

Обработка исключений в C++ вращается вокруг этих трех ключевых слов:

  • бросать– когда программа сталкивается с проблемой, она выдает исключение. Ключевое слово throw помогает программе выполнить бросок.
  • поймать– программа использует обработчик исключений для перехвата исключения. Он добавляется в раздел программы, где нужно разобраться с проблемой. Это делается с помощью ключевого слова catch.
  • стараться– блок try идентифицирует блок кода, для которого будут активированы определенные исключения. За ним должен следовать один или несколько блоков catch.

Предположим, блок кода вызовет исключение. Исключение будет перехвачено методом с использованием ключевых слов try и catch. Блок try/catch должен окружать код, который может генерировать исключение. Такой код известен как защищенный код.

Синтаксис

Try/catch использует следующий синтаксис:

try {
   // the protected code
} catch( Exception_Name exception1 ) {
   // catch block
} catch( Exception_Name exception2 ) {
   // catch block
} catch( Exception_Name exceptionN ) {
   // catch block
}
  • Хотя у нас есть один оператор try, у нас может быть много операторов catch.
  • ExceptionName — это имя исключения, которое необходимо перехватить.
  • «Exception1», «Exception2» и «ExceptionN» — это определенные вами имена для ссылки на исключения.

Пример 1:

#include<iostream>
#include<vector>
using namespace std;

int main() {
	vector<int> vec;
	vec.push_back(0);	
	vec.push_back(1);	
	// access the third element, which doesn't exist
	try
	{
		vec.at(2);		
	}
	catch (exception& ex)
	{
		cout << "Exception occurred!" << endl;
	}
	return 0;
}

Выход:

Ключевые слова обработки исключений

Вот скриншот кода:

Ключевые слова обработки исключений

Code Объяснение:

  1. Включите заголовочный файл iostream в программу, чтобы использовать его. Функции.
  2. Включите векторный заголовочный файл в программу, чтобы использовать ее функции.
  3. Включите пространство имен std в программу в ее классы, не вызывая его.
  4. Вызовите функцию main(). Логика программы должна быть добавлена ​​в ее тело.
  5. Создайте вектор с именем vec для хранения целочисленных данных.
  6. Добавьте элемент 0 в вектор с именем vec.
  7. Добавьте элемент 1 в вектор с именем vec.
  8. Комментарий. Он будет пропущен C++ компилятор.
  9. Используйте оператор try, чтобы перехватить исключение. { отмечает начало тела блока try/catch. Код, добавленный в тело, станет защищенным кодом.
  10. Попробуйте получить доступ к элементу, хранящемуся по индексу 2 (третий элемент) вектора с именем vec. Этот элемент не существует.
  11. Конец тела блока try/catch.
  12. Поймать исключение. Возвращенное сообщение об ошибке будет сохранено в переменной ex.
  13. Выведите какое-нибудь сообщение на консоль, если исключение будет обнаружено.
  14. Конец корпуса блока улавливания.
  15. Программа должна вернуть значение после успешного выполнения.
  16. Конец тела функции main().

Пример 2:

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {

	if (y == 0) {
		throw "Division by Zero!";
	}
	return (x / y);
}

int main() {
	int a = 11;
	int b = 0;
	double c = 0;

	try {
		c = zeroDivision(a, b);
		cout << c << endl;
	}
	catch (const char* message) {
		cerr << message << endl;
	}
	return 0;
}

Выход:

Ключевые слова обработки исключений

Вот скриншот кода:

Ключевые слова обработки исключений

Code Объяснение:

  1. Включите заголовочный файл iostream в программу, чтобы использовать ее функции.
  2. Включите пространство имен std в программу в ее классы, не вызывая его.
  3. Создайте функцию с именем ZeroDivision, которая принимает два целочисленных аргумента: x и y. Функция должна возвращать двойной результат.
  4. Используйте оператор if, чтобы проверить, равно ли значение аргумента переменной y 0. { отмечает начало тела if.
  5. Сообщение, которое будет возвращено/выброшено, если y равен 0.
  6. Конец тела оператора if.
  7. Функция ZeroDivision должна возвращать значение x/y.
  8. Конец тела функции ZeroDivision.
  9. Вызовите метод main(). { отмечает начало этого метода.
  10. Объявите целочисленную переменную и присвойте ей значение 11.
  11. Объявите целочисленную переменную b и присвойте ей значение 0.
  12. Объявите двойную переменную c и присвойте ей значение 0.
  13. Используйте оператор try, чтобы перехватить исключение. { отмечает начало тела блока try/catch. Код, добавленный в тело, станет защищенным кодом.
  14. Вызов функции нулевогоDivision и передача аргументам a и b, то есть 11 и 0. Результат этой операции будет сохранен в переменной c.
  15. Выведите значение переменной c на консоль.
  16. Конец тела блока try/catch.
  17. Поймать исключение. Возвращенное сообщение об ошибке будет сохранено в переменной message.
  18. Распечатайте возвращенное сообщение об ошибке на консоли.
  19. Конец корпуса блока улавливания.
  20. Программа должна вернуть значение после успешного выполнения.
  21. Конец тела функции main().

C++ Стандартные исключения

C++ Стандартные исключения

C++ поставляется со списком стандартных исключений, определенных в сорт. Они описаны ниже:

Исключение Описание
std :: exception Это исключение и родительский класс всех стандартных C++ исключения.
std :: bad_alloc Это исключение генерируется новым ключевым словом.
станд::bad_cast Это исключение, создаваемое динамическим_cast.
std::bad_Exception Полезное устройство для обработки неожиданных исключений в C++ программ.
std::bad_typeid Исключение, выдаваемое typeid.
std :: logic_error Это исключение теоретически можно обнаружить путем чтения кода.
std::domain_error Это исключение, возникающее после использования математически неверного домена.
std :: invalid_argument Исключение, вызванное использованием недопустимых аргументов.
std::length_error Исключение, возникающее после создания большого std::string.
std::out_of_range Выброшено методом.
std :: runtime_error Это исключение, которое невозможно обнаружить путем чтения кода.
std::overflow_error Это исключение генерируется после возникновения математического переполнения.
std::range_error Это исключение генерируется при попытке сохранить значение, выходящее за пределы допустимого диапазона.
std::underflow_error Исключение, возникающее после возникновения математического опустошения.

Пользовательские исключения

C++ Класс std::Exception позволяет нам определять объекты, которые могут быть исключены как исключения. Этот класс был определен в заголовок. Класс предоставляет нам виртуальную функцию-член с именем What.

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

Пример:

#include <iostream>
#include <exception>
using namespace std;

class newException : public exception
{
	virtual const char* what() const throw()
	{
		return "newException occurred";
	}
} newex;

int main() {

	try {
		throw newex;
		}
	catch (exception& ex) {
		cout << ex.what() << '\n';
	}
	return 0;	
}

Выход:

Пользовательские исключения

Вот скриншот кода:

Пользовательские исключения

Code Объяснение:

  1. Включите заголовочный файл iostream в нашу программу. Мы будем использовать его функции, не получая ошибок.
  2. Включите файл заголовка исключения в нашу программу. Мы будем использовать его функции как то без ошибок.
  3. Включите пространство имен std в нашу программу, чтобы использовать его классы, не вызывая его.
  4. Создайте новый класс с именем newException. Этот класс наследует класс исключений C++.
  5. Начало тела класса.
  6. Перезапишите виртуальную функцию-член What(), определенную в файле заголовка исключения. Затем мы опишем наше собственное исключение, новое исключение.
  7. Начните определение нового исключения.
  8. Сообщение, которое будет возвращено, если будет обнаружено новое исключение.
  9. Конец определения нового исключения.
  10. Конец тела класса newException. Newex — это имя, которое будет использоваться для перехвата нашего нового исключения, после чего будет вызвано новое исключение.
  11. Вызовите функцию main(). Логика программы должна быть добавлена ​​в ее тело. { отмечает начало тела.
  12. Используйте оператор try, чтобы отметить код, в котором нам нужно отметить исключение. { отмечает начало тела блока try/catch. Код, окруженный этим, станет защищенным.
  13. Выдайте исключение newex, если оно будет обнаружено.
  14. Конец тела попытки.
  15. Используйте оператор catch, чтобы перехватить исключение. Сообщение об ошибке исключения будет сохранено в переменной ex.
  16. Распечатайте сообщение об ошибке исключения на консоли.
  17. Конец тела оператора catch.
  18. Программа должна вернуть значение, если она выполняется успешно.
  19. Конец тела функции main().

Часто задаваемые вопросы (FAQ)

Обработка исключений — это способ обнаружения ошибок во время выполнения и реагирования на них. C++ Использование ключевых слов try, throw и catch позволяет программе восстановиться, а не завершиться с ошибкой.

C++ Используется три ключевых слова: try оборачивает код, который может завершиться ошибкой, throw вызывает исключение при возникновении ошибки, а catch обрабатывает выброшенное исключение.

Разместите рискованный код в блоке try, а затем добавьте один или несколько блоков catch, каждый из которых обрабатывает определенный тип исключения, выброшенного из блока try.

Стандартные исключения — это встроенные классы исключений в заголовке исключения, такие как std::bad_alloc и std::out_of_range, которые сообщают о распространенных ошибках времени выполнения.

Пользовательское исключение — это пользовательский класс, часто производный от std::exception, который переопределяет функцию what() для описания вашей собственной конкретной ситуации ошибки.

Искусственный интеллект, используемый в таких сервисах, как GitHub Copilot, оборачивает рискованный код в блоки try-catch, генерирует пользовательские классы исключений и предлагает, какие исключения следует перехватывать по мере ввода текста.

Да. Инструменты на основе ИИ обнаруживают необработанные исключения, предлагают конкретные блоки обработки исключений вместо общих и добавляют содержательные сообщения об ошибках, что делает ваш процесс более эффективным. C++ Более надежный код.

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

Подведем итог этой публикации следующим образом: