Программирование >>  Программирование на языке c++ 

1 ... 98 99 100 [ 101 ] 102 103 104 ... 159


4- инструкция throw всегда передает управление ближайшему найденному обработчику исключения, т. е. обработчику, чей try блок был выполнен последним, и этот try блок еще не завершен;

выражение throw operand строит временный статический объект типа operand и использует его для соответствующего обработчика исключений;

ключевое слово throw можно использовать в следующих формах:

а) throw operand; - устанавливает индикатор (operand) исключения, который передается соответствующему обработчику исключения;

б) throw; - повторно активизирует то же исключение. Это исключение должно в данный момент существовать, в противном случае будет вызвана специальная функция, называемая terminate;

в) void f() throw (X,Y) { ... } - задается список (X,Y) исключений, которые могут быть сгенерированы функцией f. Если функция f генерирует другие исключения (не X и не Y), то автоматически вызывается специальная функция, называемая unexpected;

г) void f() throwO { ... } - определяет функцию f, которая

не генерирует исключения;

поскольку список исключений задается при объявлении функции f, то попытка со стороны функции f сгенерировать исключение, которого нет в списке ее исключений, приводит к автоматическому вызову функции unexpected. Список исключений не является частью типа функции. Для этого списка приняты следующие соглашения:

а) функция без последующего списка может генерировать любое исключение;

б) функция с пустым списком вида throw() не может генерировать исключения;

в) функция, которая может генерировать исключение класса X, может также генерировать любое исключение производного класса Y (X<-Y) при условии, что



базовый класс X имеет атрибут public, например class Y : public X {... };

4- обработчик исключения (блок catch) можно задать в двух формах (см. ниже форму А или форму В):

try {... }

А: catch(Type Object) {...}

В: catch(...) {... }

Здесь действительный тип аргумента Object может быть: Туре, Туре&, const Туре или const Туре&. Аргумент Object будет воспринят обработчиком (т. е. будет установлено соответствие между аргументами throw и catch), если выполняется хотя бы одно из следующих правил:

а) Object имеет тип Туре;

б) Туре - это тип доступного базового класса для объекта Object в точке активизации инструкции throw;

в) Туре - это указатель (тип указатель ), и Object имеет

тип указатель , который можно преобразовать к Туре посредством применения стандартных правил преобразования указателей в точке активизации инструкции throw.

Обработчик catch(...) обрабатывает любое исключение независимо от его типа;

4- поиск соответствующего обработчика исключений осуществляется в той последовательности, в которой эти обработчики встречаются в программе;

4- пусть заданы обработчики исключений классов Base, Derived и Base<-Derived. Тогда, если поместить обработчик класса Base перед обработчиком класса Derived, то это является ошибкой, поскольку обработчик класса Derived никогда не будет выполняться;

4- обработчик catch(...) всегда должен быть последним в соответствующем списке обработчиков исключений;

4- после завершения выполнения блока обработчика исключения (достижения закрывающейся фигурной скобки этого блока) управление передается в конец списка всех



обработчиков исключений для соответствующего блока try;

для выхода из блоков catch или try нельзя использовать инструкцию goto;

функция terminate автоматически вызывается в следующих случаях:

а) если при возникновении исключения не может быть найден соответствующий обработчик;

б) если механизм обработки исключений обнаруживает соответствующие ощибки в стеке;

в) если при выполнении процесса stack unwinding нарушается работа деструктора, разрушающего соответствующие автоматические объекты.

По умолчанию функция terminate вызывает библиотечную функцию al3ort(). Пользователь может переопределить функцию terminate, используя функцию s€t terminate (см. § 7.6, 7.8). Переопределенная функция terminate в конечном счете тоже должна завершать программу. Игнорирование этого правила является ошибкой;

функция unexpected автоматически вызывается, когда исключение Е генерируется в некоторой функции F, и зто исключение Е не включено в список исключений для функции F. По умолчанию функция unexpected вызывает функцию terminate. Пользователь может переопределить функцию unexpected, используя функцию set unexpected (см. §7.6, 7.8);

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



1 ... 98 99 100 [ 101 ] 102 103 104 ... 159

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика