Тип exception


Все исключения в языке C++ описываются типом exception, который определен в заголовочном файле <exception>. И при обработке исключений мы также можем использовать данный класс. Например:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <exception>

double divide(int, int);

int main()
{
int x = 500;
int y = 0;
try
{
double z = divide(x, y);
std::cout << z << std::endl;
}
catch (const std::exception& err)
{
std::cout << "Error!!!" << std::endl;
}
std::cout << "The End..." << std::endl;
return 0;
}

double divide(int a, int b)
{
if (b == 0)
throw std::exception();
return a / b;
}
Прежде всего, оператору throw передается объект типа std::exception. Данный объект инициализируется строкой "Division by zero!", которая передает информацию о характере ошибки.

1
throw std::exception("Division by zero!");
Если мы хотим отловить исключения типа exception, то нам надо в выражении catch определить переменную этого типа:

1
catch (const std::exception& err)
То есть здесь err представляет переменную типа exception. Не обязательно определять переменную именно как константную ссылку, можно определить ее и так:

1
catch (std::exception err)
Если мы не собираемся использовать эту переменную в блоке catch, то можно указать просто тип исключения:

1
2
3
4
catch (std::exception)
{
std::cout << "errrorr" << std::endl;
}
Также стоит отметить различия в реализации компиляторов. Так, Visual Studio позволяет инициализировать объект exception строкой. Например, можно передать сообщение об ошибке:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <exception>

double divide(int, int);

int main()
{
int x = 500;
int y = 0;
try
{
double z = divide(x, y);
std::cout << z << std::endl;
}
catch (std::exception err)
{
std::cout << err.what() << std::endl;
}
std::cout << "The End..." << std::endl;
return 0;
}

double divide(int a, int b)
{
if (b == 0)
throw std::exception("Division by zero!");
return a / b;
}
С помощью метода what() в блоке catch можно получить переданное сообщение и, к примеру, вывести его на консоль:

1
2
3
4
catch (std::exception err)
{
std::cout << err.what() << std::endl;
}
Но в g++ этот код работать не будет, так как тип exception для g++ не может быть инициализирован строкой.