Программирование на C и C++

Онлайн справочник программиста на C и C++

Повторная генерация исключений

Если возникает необходимость снова сгенерировать исключения из блока, который обрабатывает исключения, можно сделать это путем вызова throw без указания исключения. В результате теку­щее исключение будет передано во внешнюю последовательность try/catch обработки исключений. Причиной для этого может послужить желание обрабатывать исключения несколькими обработ­чиками. Например, один обработчик может заниматься одним аспектом исключения, а второй обработчик — другим. Исключение может быть снова сгенерировано или изнутри блока catch, или из функции, вызванной в этом блоке. Когда повторно генерируется исключение, оно не бу­дет перехвачено той же самой инструкцией catch. Оно будет распространяться до следующей внешней инструкции catch. Следующая программа иллюстрирует повторную генерацию исключе­ния. В ней повторно генерируется исключение типа char*.

// пример повторной генерации исключения
#include <iostream.h>
void Xhandler()
{
try {
throw "hello"; // генерация char *
}
catch (char *) { // перехват char *
cout << "Caught char * inside Xhandler\n";
throw; // повторная генерация char * извне функции
}
}
int main()
{
cout << "Start\n";
try{
Xhandler();
}
catch(char *) {
cout << "Caught char * inside main\n";
}
cout << "End";
return 0;
}

Эта программа выдаст на экран следующий текст:

Start
Caught char * inside Xhandler
Caught char * inside main
End