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