|
Программирование >> Программирование на языке c++
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); механизм обработки исключений непосредственно поддерживает хороший стиль программирования, поскольку плохая программа будет периодически прерываться, и это облегчает ее тестирование со стороны заказчиков программ.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |