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

Что такое обработка исключений в 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;
}

Вывод:

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

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

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

Пояснение к коду:

  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;
}

Вывод:

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

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

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

Пояснение к коду:

  1. Включите заголовочный файл iostream в программу, чтобы использовать ее функции.
  2. Включите пространство имен std в программу в ее классы, не вызывая его.
  3. Создайте функцию с именем ZeroDivision, которая принимает два целочисленных аргумента: x и y. Функция должна возвращать double результат.
  4. Используйте оператор if, чтобы проверить, равно ли значение аргумента переменной y 0. { отмечает начало тела if.
  5. Сообщение, которое будет возвращено/выброшено, если y равен 0.
  6. Конец тела оператора if.
  7. Функция ZeroDivision должна возвращать значение x/y.
  8. Конец тела функции ZeroDivision.
  9. Вызовите метод main(). { отмечает начало этого метода.
  10. Объявите целочисленную переменную и присвойте ей значение 11.
  11. Объявите целочисленную переменную b и присвойте ей значение 0.
  12. Объявить double переменную 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;	
}

Вывод:

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

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

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

Пояснение к коду:

  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().

Итоги

  • Благодаря обработке исключений в C++ вы можете обрабатывать ошибки во время выполнения.
  • Ошибки времени выполнения — это ошибки, возникающие во время выполнения программы.
  • Обработка исключений помогает вам справиться с любыми непредвиденными обстоятельствами в вашей программе.
  • При возникновении непредвиденного обстоятельства управление программой передается обработчикам.
  • Чтобы перехватить исключение, вы помещаете часть кода под блок try-catch.
  • Ключевое слово throw помогает программе генерировать исключения, помогая программе справиться с проблемой.
  • Ключевое слово try помогает определить блок кода, для которого будут активированы определенные исключения.
  • Мы можем перезаписать функцию What() файла заголовка исключения, чтобы определить наши исключения.