Что такое обработка исключений в C ++?
Обработка исключений в C ++ предоставляет вам способ обработки непредвиденных обстоятельств, таких как ошибки времени выполнения. Поэтому всякий раз, когда возникают непредвиденные обстоятельства, управление программой передается специальным функциям, известным как обработчики.
Чтобы перехватить исключения, вы помещаете часть кода в проверку исключений. Раздел кода помещается в блок try-catch.
Если в этом разделе кода возникает исключительная ситуация, возникает исключение. Затем обработчик исключений возьмет на себя управление программой.
Если не возникнет никаких исключительных обстоятельств, код будет выполняться нормально. Обработчики будут проигнорированы.
В этом руководстве по C ++ вы узнаете:
- Что такое обработка исключений в C ++?
- Почему обработка исключений?
- Ключевые слова обработки исключений
- Синтаксис:
- Стандартные исключения C ++
- Пользовательские исключения
Почему обработка исключений?
Вот причина использования обработки исключений в C ++:
- Вы отделите код обработки ошибок от обычного кода. Код станет более читабельным и легким в обслуживании.
- Функции могут обрабатывать исключения, которые они выбирают. Даже если функция выдает много исключений, она обрабатывает только некоторые. Вызывающий обработает неперехваченные исключения.
Ключевые слова обработки исключений
Обработка исключений в C ++ вращается вокруг этих трех ключевых слов:
- throw - когда программа сталкивается с проблемой, она выдает исключение. Ключевое слово throw помогает программе выполнить бросок.
- catch - программа использует обработчик исключений для перехвата исключения. Он добавляется в раздел программы, в котором вам нужно решить проблему. Это делается с помощью ключевого слова catch.
- try - блок 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 - это имя исключения, которое нужно перехватить.
- Исключение1, исключение2 и исключениеN - это определенные вами имена для ссылки на исключения.
Пример 1:
#include#include using namespace std;int main() {vector vec;vec.push_back(0);vec.push_back(1);// access the third element, which doesn't existtry{vec.at(2);}catch (exception& ex){cout << "Exception occurred!" << endl;}return 0;}
Выход:
Вот скриншот кода:
Пояснение к коду:
- Включите файл заголовка iostream в программу, чтобы использовать его функции.
- Включите файл заголовка вектора в программу, чтобы использовать его функции.
- Включите пространство имен std в программу в ее классы, не вызывая его.
- Вызовите функцию main (). Логика программы должна быть добавлена в ее тело.
- Создайте вектор с именем vec для хранения целочисленных данных.
- Добавьте элемент 0 в вектор с именем vec.
- Добавьте элемент 1 в вектор с именем vec.
- Комментарий. Он будет пропущен компилятором C ++.
- Используйте оператор try, чтобы поймать исключение. {Отмечает начало тела блока try / catch. Код, добавленный в тело, станет защищенным кодом.
- Попытайтесь получить доступ к элементу, хранящемуся в индексе 2 (третий элемент) вектора с именем vec. Этот элемент не существует.
- Конец тела блока try / catch.
- Поймай исключение. Возвращенное сообщение об ошибке будет сохранено в переменной ex.
- Распечатайте какое-нибудь сообщение на консоли, если исключение будет обнаружено.
- Конец корпуса фиксирующего блока.
- Программа должна вернуть значение при успешном выполнении.
- Конец тела функции main ().
Пример 2:
#includeusing 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;}
Выход:
Вот скриншот кода:
Пояснение к коду:
- Включите файл заголовка iostream в программу, чтобы использовать его функции.
- Включите пространство имен std в программу в ее классы, не вызывая его.
- Создайте функцию с именем zeroDivision, которая принимает два целочисленных аргумента, x и y. Функция должна вернуть двойной результат.
- Используйте оператор if, чтобы проверить, равно ли значение переменной аргумента y 0. Знак {отмечает начало тела if.
- Сообщение, которое будет возвращено / выброшено, если y равно 0.
- Конец тела оператора if.
- Функция zeroDivision должна возвращать значение x / y.
- Конец тела функции zeroDivision.
- Вызовите метод main (). {Отмечает начало этого метода.
- Объявить целочисленную переменную и присвоить ей значение 11.
- Объявить целочисленную переменную b и присвоить ей значение 0.
- Объявите двойную переменную c и присвойте ей значение 0.
- Используйте оператор try, чтобы поймать исключение. {Отмечает начало тела блока try / catch. Код, добавленный в тело, станет защищенным кодом.
- Вызвать функцию zeroDivision и передать аргументам a и b, то есть 11 и 0. Результат этой операции будет сохранен в переменной c.
- Распечатайте значение переменной c на консоли.
- Конец тела блока try / catch.
- Поймай исключение. Возвращенное сообщение об ошибке будет сохранено в сообщении переменной.
- Распечатайте возвращенное сообщение об ошибке на консоли.
- Конец корпуса фиксирующего блока.
- Программа должна вернуть значение при успешном выполнении.
- Конец тела функции main ().
Стандартные исключения C ++
C ++ поставляется со списком стандартных исключений, определенных в классе
Исключение | Описание |
std :: exception | Это исключение и родительский класс для всех стандартных исключений C ++. |
std :: bad_alloc | Это исключение вызывается новым ключевым словом. |
std :: bad_cast | Это исключение, созданное dynamic_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 | Брошено методом at. |
std :: runtime_error | Это исключение, которое нельзя обнаружить путем чтения кода. |
std :: overflow_error | Это исключение возникает после математического переполнения. |
std :: range_error | Это исключение возникает при попытке сохранить значение вне допустимого диапазона. |
std :: underflow_error | Исключение, возникающее после возникновения математической потери значимости. |
Пользовательские исключения
Класс C ++ std :: exception позволяет нам определять объекты, которые могут быть выброшены как исключения. Этот класс был определен в заголовке
Эта функция возвращает последовательность символов с завершающим нулем типа char *. Мы можем перезаписать его в производных классах, чтобы иметь описание исключения.
Пример:
#include#include 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;}
Выход:
Вот скриншот кода:
Пояснение к коду:
- Включите заголовочный файл iostream в нашу программу. Мы будем использовать его функции без ошибок.
- Включите файл заголовка исключения в нашу программу. Мы будем использовать его функции как без ошибок.
- Включите пространство имен std в нашу программу, чтобы использовать его классы, не вызывая его.
- Создайте новый класс с именем newException. Этот класс наследует класс исключений C ++.
- Начало тела класса.
- Перезаписать виртуальную функцию-член what (), определенную в файле заголовка исключения. Затем мы опишем наше собственное исключение, новое исключение.
- Начните определение нового исключения.
- Сообщение, которое будет возвращено, если будет обнаружено новое исключение.
- Конец определения нового исключения.
- Конец тела класса newException. Newex - это имя, которое будет использоваться для перехвата нашего нового исключения, после которого будет вызываться newException.
- Вызовите функцию main (). Логика программы должна быть добавлена в ее тело. {Отмечает начало его тела.
- Используйте оператор try, чтобы пометить код, в котором нам нужно отметить исключение. {Отмечает начало тела блока try / catch. Код, окруженный этим, станет защищенным.
- Бросить исключение newex, если оно обнаружено.
- Конец тела попытки.
- Используйте оператор catch, чтобы перехватить исключение. Сообщение об ошибке исключения будет сохранено в переменной ex.
- Распечатайте сообщение об ошибке исключения на консоли.
- Конец тела оператора catch.
- Программа должна вернуть значение, если она выполняется успешно.
- Конец тела функции main ().
Резюме:
- С помощью обработки исключений в C ++ вы можете обрабатывать ошибки времени выполнения.
- Ошибки времени выполнения - это ошибки, возникающие во время выполнения программы.
- Обработка исключений помогает справиться с любыми непредвиденными обстоятельствами в вашей программе.
- При возникновении непредвиденных обстоятельств управление программой передается обработчикам.
- Чтобы перехватить исключение, вы помещаете часть кода под блок try-catch.
- Ключевое слово throw помогает программе генерировать исключения, помогая программе справиться с проблемой.
- Ключевое слово try помогает идентифицировать блок кода, для которого будут активированы определенные исключения.
- Мы можем перезаписать функцию what () файла заголовка исключения, чтобы определить наши исключения.