Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 57стр.doc
Скачиваний:
54
Добавлен:
15.06.2014
Размер:
478.21 Кб
Скачать

Вопрос 42. Спецификация исключений. Обработка неожиданных исключений.

В описании ф-ции может быть указана спецификация исключений — список исключений, к-ые могут генерироваться этой функцией:

int g (float h} throw (а, b, с) {

// тело функции }

Можно ограничить типы исключений, к-ые могут генерироваться данной ф-цией. Типы исключений специфицируются в объявлении ф-ции как спецификация исключений. Эта спецификация перечисляет исключения, к-ые могут быть сгенерированы в функции. Функция может генерировать обозначенные исключения или типы, производные от них. Хотя при этом предполагается гарантия, что другие типы исключений генерироваться не будут, генерация их все-таки возможна.

Ф-ция без спецификации исключений может генерировать любое исключение:

void g (); // эта функция может генерировать любое исключение

Ф-ции, содержащие пустую спецификацию исключений, не генерируют исключений:

void g () throw (); // эта ф-ция не генерирует никаких исключений (не вырабатывает никаких исключений), где throw () - пустая спецификация исключений

Если генерируется исключение, не перечисленное в спецификации, вызывается функция обработки непредусмотренных исключений unexpected. Ф-ция unexpected может быть переопределена с помощью ф-ции set_unexpected.

Если ф-ция генерирует исключение некоторого класса, то эта ф-ция может также генерировать исключения всех классов, к-ые явл-ся производными от этого класса.

Обработка неожидаемых исключений

Ф-ция unexpected вызывает ф-цию, определен с помощью ф-ции set_unexpected. Если нет ф-ции, определенной таким способом, то по умолчанию вызывается ф-ция завершения программы terminate.

Функция terminate может быть вызвана различными путями:

  • явно;

  • если сгенерированное исключение не может быть перехвачено;

  • если во время обработки исключения разрушен стек;

  • как заданное по умолчанию действие при вызове unexpected;

  • во время разматывания стека, вызванного исключением, и попытки со стороны деструктора сгенерировать исключение, что вызывает обращение к terminate.

Ф-ция set_terminate может задавать ф-цию, к-ая будет вызываться при вызове terminate. Иначе, terminate вызывает abort.

Ф-ции set_terminate и set_unexpected получают в кач-ве аргументов ук-ли на ф-ции. Каждый аргумент должен указывать на ф-цию, возвращающую тип void и без аргументов.

Если последним действием определенной пользователем ф-ции завершения не явл-ся завершение работы программы, то автоматически будет вызываться ф-ция abort для прекращения работы программы после выполнения других операторов определенной пользователем ф-ции завершения.

Вопрос 43. «Раскручивание» стека. Иерархия исключений стандартной библиотеки.

Одним из главных преимуществ исп-я обработки искл ситуации явл обеспечение развёртывания стека. Раскручивание стека – процесс вызова деструкторов локальных объектов, когда искл ситуации выводят их из области видимости. При запуске исключения автоматически вызываются деструкторы всех стековых объектов между throw и catch.

Когда исключение выброшено, но не перехвачено в некоторой области действия, стек вызовов разматывается и делается попытка перехвата исключения в следующем внешнем блоке try/catch. Разматывание стека вызовов означает, что функция, в которой исключение не было перехвачено, завершается, все локальные переменные разрушаются, а управление возвращается в ту точку, откуда функция была вызвана. Если эта точка программы находится в блоке try, предпринимается попытка перехватить исключение. Если же данная точка не находится в блоке try или исключение не перехвачено, то снова происходит разматывание стека. Если исключение в программе не перехвачено, вызывается функция terminate, завершающая ее работу.

Иерархия исключений стандартной библиотеки:

Вершиной иерархии является базовый класс exception, к-ый содержит ф-цию what(), переопределенную в каждом производном классе для выдачи соответствующего сообщения об ошибке.

Непосредственными производными классами базового exception являются runtime_error и logic_error, каждый из к-ых имеет несколько производных классов.

Кроме того, производными от exception являются исключения bad_alloc (выбрасывается операцией new), bad_cast (выбрасывается операцией dynamic_cast) и bad_typeid (выбрасывается typeid).

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

  • invalid_argument (ф-ции был передан недопустимый аргумент).

  • length_error (для объекта была использована длина, большая мах-но допустимой для объекта).

  • out_of_range ( значение индекса массива или объекта string находится вне допустимого диапазона).

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

  • overflow_error ( арифметическую ошибка переполнения).

  • underflow_error (ошибка исчезновения порядка).