В сложных программах довольно часто возникает ситуация, когда исключение должно быть обработано на различных уровнях программы разными обработчиками. Для этого необходимо чтобы после обработки в одном catch-блоке исключение снова было сгенерировано и перешло на обработку во внешний catch-блок.
Такое поведение реализуется вызовом в блоке catch оператора throw без последующего выражения.
#include <iostream>
using namespace std;
void func()
{
int* a = new int;
try
{
cout << "Введите число, отличное от 0: ";
cin >> *a;
if (*a == 0)
throw *a;
cout << 1.0/(*a);
delete a;
}
catch (int ex)
{
delete a;
cerr << "Перехвачено исключение " << ex << " из функции func\n";
throw;
}
}
void main()
{
setlocale(LC_ALL, "Russian");
try
{
func();
}
catch (int ex)
{
cerr << "Перехвачено исключение " << ex << " из функции main\n";
}
cout << '\n';
system("Pause");
}
Результат выполнения программы:
Введите число, отличное от 0: 0
Перехвачено исключение 0 из функции func
Перехвачено исключение 0 из функции main
Пусть исключение, сгенерированное в функции func нужно обработать во внешней программе – в функции main. Но внутри func при возникновении исключения также необходимо выполнить определённые действия – освободить выделенную здесь же динамическую память. Поэтому func включает обработчик ошибок, в конце которого вызывается throw. При выполнении throw повторно генерируется исключение ex, которое будет обработано следующим блоком catch – из функции main.
Предостережение! Выполнение throw без последующего выражения ВНЕ catch-блока приведёт к немедленному аварийному останову программы.