Обработка исключений C++
Исключением является проблема, возникающая во время выполнения программы. Исключение C++ — это реакция на исключительное обстоятельство, возникающее во время работы программы, например, на попытку деления на ноль.
Исключения позволяют передавать управление из одной части программы в другую. Обработка исключений C++ основана на трех ключевых словах:try, catch, и бросить .
-
бросить − Программа выдает исключение при обнаружении проблемы. Это делается с помощью throw ключевое слово.
-
поймать − Программа перехватывает исключение с помощью обработчика исключений в том месте программы, где вы хотите обработать проблему. Подвох ключевое слово указывает на перехват исключения.
-
попробовать − попытаться block идентифицирует блок кода, для которого будут активированы определенные исключения. За ним следует один или несколько блоков catch.
Предполагая, что блок вызовет исключение, метод перехватывает исключение, используя комбинацию try и поймать ключевые слова. Блок try/catch размещается вокруг кода, который может генерировать исключение. Код в блоке try/catch называется защищенным кодом, а синтаксис для использования try/catch выглядит следующим образом —
try {
// protected code
} catch( ExceptionName e1 ) {
// catch block
} catch( ExceptionName e2 ) {
// catch block
} catch( ExceptionName eN ) {
// catch block
}
Вы можете перечислить несколько поймать операторы для перехвата различных типов исключений в случае, если вы попробуете блок вызывает более одного исключения в разных ситуациях.
Вызов исключений
Исключения можно создавать в любом месте блока кода с помощью throw. утверждение. Операнд инструкции throw определяет тип исключения и может быть любым выражением, а тип результата выражения определяет тип выбрасываемого исключения.
Ниже приведен пример создания исключения при выполнении условия деления на ноль —
double division(int a, int b) {
if( b == 0 ) {
throw "Division by zero condition!";
}
return (a/b);
}
Перехват исключений
Подвох блокировать после попытки блок перехватывает любое исключение. Вы можете указать, какой тип исключения вы хотите перехватывать, и это определяется объявлением исключения, которое появляется в круглых скобках после ключевого слова catch.
try {
// protected code
} catch( ExceptionName e ) {
// code to handle ExceptionName exception
}
Приведенный выше код поймает исключение ExceptionName. тип. Если вы хотите указать, что блок catch должен обрабатывать исключение любого типа, которое выдается в блоке try, вы должны поместить многоточие ... между круглыми скобками, заключающими объявление исключения, следующим образом —
try {
// protected code
} catch(...) {
// code to handle any exception
}
Ниже приведен пример, в котором возникает исключение деления на ноль, и мы перехватываем его в блоке catch.
Живая демонстрация
#include <iostream>
using namespace std;
double division(int a, int b) {
if( b == 0 ) {
throw "Division by zero condition!";
}
return (a/b);
}
int main () {
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
} catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}
Поскольку мы вызываем исключение типа const char* , поэтому при перехвате этого исключения мы должны использовать const char* в блоке catch. Если мы скомпилируем и запустим приведенный выше код, это даст следующий результат —
Division by zero condition!
Стандартные исключения C++
C++ предоставляет список стандартных исключений, определенных в
Вот небольшое описание каждого исключения, упомянутого в приведенной выше иерархии —
| Старший № | Исключение и описание |
|---|---|
| 1 | <тд>|
| 2 | <тд>|
| 3 | <тд>|
| 4 | <тд>|
| 5 | <тд>|
| 6 | <тд>|
| 7 | <тд>|
| 8 | <тд>|
| 9 | <тд>|
| 10 | <тд>|
| 11 | <тд>|
| 12 | <тд>|
| 13 | <тд>|
| 14 | <тд>
Определить новые исключения
Вы можете определить свои собственные исключения, наследуя и переопределяя Exception функциональность класса. Ниже приведен пример, который показывает, как вы можете использовать класс std::exception для реализации вашего собственного исключения стандартным способом —
Живая демонстрация
#include <iostream>
#include <exception>
using namespace std;
struct MyException : public exception {
const char * what () const throw () {
return "C++ Exception";
}
};
int main() {
try {
throw MyException();
} catch(MyException& e) {
std::cout << "MyException caught" << std::endl;
std::cout << e.what() << std::endl;
} catch(std::exception& e) {
//Other errors
}
}
Это даст следующий результат —
MyException caught C++ Exception
Здесь что() является общедоступным методом, предоставляемым классом исключений, и он был переопределен всеми дочерними классами исключений. Это возвращает причину исключения.
Язык C