Скачиваний:
189
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

7. Алгоритм раскручивания стека. Раскручивание стека при нормальном и аварийном завершении программы. Пример использования.

Поиск catch-обработчикадля возбужденного исключения происходит следующим образом. Когда выражение throw находится в try-блоке, все ассоциированные с ним предложения catch исследуются с точки зрения того, могут ли они обработать исключение. Если подходящее предложение catch найдено, то исключение обрабатывается. В противном случае поиск продолжается в вызывающей функции. Предположим, что вызов функции, выполнение которой прекратилось в результате исключения, погружен в try-блок; в такой ситуации исследуются все предложения catch, ассоциированные с этим блоком. Если один из них может обработать исключение, то процесс заканчивается. В противном случае переходим к следующей по порядку вызывающей функции. Этот поиск последовательно проводится во всей цепочке вложенных вызовов. Как только будет найдено подходящее предложение, управление передается в соответствующий обработчик.

Процесс, в результате которого программа последовательно покидает составные инструкции и определения функций в поисках предложения catch, способного обработать возникшее исключение, называется раскруткой стека. По мере раскрутки прекращают существование локальные объекты, объявленные в составных инструкциях и определениях функций, из которых произошел выход. C++ гарантирует, что во время описанного процесса вызываются деструкторы локальных объектов классов, хотя они исчезают из-за возбужденного исключения.

Если в программе нет подходящего catch, способного обработать исключение, оно остается необработанным. Но исключение – это настолько серьезная ошибка, что программа не может продолжать выполнение. Поэтому, если обработчик не найден, вызывается функция terminate() из стандартной библиотеки C++. По умолчанию terminate() активизирует функцию abort(), которая аномально завершает программу.

8. Понятие абсолютного обработчика, его синтаксис, особенности использования. Пример использования.

Существует также абсолютный обработчик, который совместим с

любым типом исключительной ситуации. Для написания такого

обработчика надо вместо аргументов написать многоточие (эллипсис).

catch (...) {блок обработки исключения}

Использование абсолютного обработчика исключительных ситуаций

рассмотрим на примере программы, в которой происходит генерация

исключительной ситуации типа char*, но обработчик такого типа

отсутствует. В этом случае управление передается абсолютному

обработчику.

#include <iostream>

using namespace std;

void intException(int i) {

if (i > 100) throw 1;//генерация исключения типа int

}

void stringException() {

throw "Error"; // генерация исключения типа char*

}

int main() {

try {//в блоке возможна обработка одного из двух исключений

intException(99); // возможно исключение типа int

stringException(); // возможно исключение типа char*

}

catch (int) { cout << "Сработал обработчик для типа int" <<endl; }

catch (...) { cout << "Сработал абсолютный обработчик "<< endl; }

}

Так как абсолютный обработчик перехватывает исключительные

ситуации любых типов, то он должен стоять в списке обработчиков

последним.