Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
13
Добавлен:
25.04.2019
Размер:
1.34 Mб
Скачать

Throw expression

где expression – выражение, которое определяет тип генерируемого исключения и способ его передачи в блок обработки.

При выполнении оператора throw формируется временный объект-исключение того типа, который определен выражением expression, и этот объект передается («выбрасывается») за пределы контролируемого блока (в контекст, окружающий этот блок). Этот объект поступает в подходящий блок обработки и инициализирует объект, объявленный в заголовке catch. Существование временного объекта ограничивается моментами возбуждения исключения и завершения обработки (штатным или аварийным способом).

Механизм обработки исключений допускает многократное вложение контролируемых блоков. Если исключение не может быть обработано на текущем уровне обработчиков, то оно может быть передано (ретранслировано) на более высокий уровень. Для этой цели используется оператор throw без выражения генерации исключения. Этот оператор вызывает повторную генерацию уже существующего исключения. Например:

try { // контролируемый блок

DataObject.AllocateMemory();

InputStream >> DataObject;

DataObject.Process();

OutputStream << DataObject;

}

catch(CIOException &) // обработчик исключений CIOException

{ ... }

catch(...) // обработчик остальных исключений

{

cerr << endl << “Такие исключения обрабатывать не могу”;

throw;

}

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

Процесс передачи объекта-исключения в точку обработки сопровождается так называемой «развязкой» стека. Ее цель – удаление всех объектов, локальных по отношению к контексту контролируемого блока, где возникло исключение, а также очистка стековых окон всех функций, вызванных в этом контексте. В ходе развязки стека осуществляется уничтожение всех локальных объектов. Для этого механизм исключений предусматривает автоматический вызов их деструкторов. При этом также удаляются все вложенные в них объекты39.

7.2. Спецификации исключений

При разработке функций в С++ программист может явно указывать, какие типы исключений потенциально генерирует каждая функция. В результате появляется возможность более жесткого контроля исключений и упорядочения их генерации и обработки. Чтобы оформить спецификацию, определение функции дополняется фразой throw40:

throw(type1, type2, ..., typeN)

которая перечисляет типы всех исключений type1, type2, ..., typeN, которые могут возбуждаться этой функцией явно или косвенно. Если функция вообще не должна генерировать исключений, то ее определение дополняется фразой: throw()

Пример

void f1(int) throw(); // исключений не ожидается

int f2(double, char*) throw(const char *);

// только исключения типа const char *

double f3(void) throw(int, char, A);

// исключения встроенных типов int, char и пользовательского типа A

Если некоторая функция генерирует исключение, которое от нее не ожидается, то по умолчанию управление передается из этой функции специальной библиотечной функции unexpected, выполнение которой заканчивается вызовом функции abort. Программа аварийно завершается. Если исключения непредусмотренных типов порождаются функциями, которые вызываются из данной функции, то их обработку должна реализовать сама данная функция. В противном случае исключение выходит за пределы функции и считается неопределенным. Это, в свою очередь, опять ведет к вызову функции unexpected.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]