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

67.Операторы throw и catch.

Операторы throw и catch.

Обработчик исключения начинается ключевым словом catch с объявлением в круглых скобках. Если тип, определенный в этом объявлении, совпадает с типом значения, данного в операторе throw, управление будет передано в блок, следующий за ключевым словом catch. В случае несовпадения типов, программа осуществляет поиск другого обработ­чика.

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

try {/*блок try*/

}catch(type1 arg){/*блок catch*/}

//операторы

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

#include <iostream.h>//пример 52

int main() {

try {

// начало блока try

cout << "Внутри блока try\n";

throw 10; // генерация ошибки 10

cout << "Это выполнено не будет\n";

}

catch (int i) { // перехват ошибки

cout << "Перехвачена ошибка номер: "<< i << "\n";

}

catch (char *s) { // перехват ошибки

cout << "Перехвачена ошибка номер: "<<s << "\n";

}

return 0;

}

Будет выведено:

Внутри блока try

Перехвачена ошибка: 10

Оператор throw генерирует ошибку, после чего управление передано блоку catch. Если заменить тип ошибки int на double, ошибка перехвачена не будет. Для перехвата всех исключительных ситуаций независимо от типа можно воспользоваться многоточием, которое соответствует любому типу данных.

catch(…) {/*тело*/}

Ключевое слово throw после заголовка функции используется для опре­де­ления списка инициализированных исключений:

void funс( ) throw (except1, except2, except3, char*) { }

Функции, генерирующие исключения, вызываются из блока try. Описанная без оператора throw функция не может корректно для течения программы инициализировать исключение, а та, которая может это сделать, способна вызвать также исключение типа, производного от него. Блок catch, который перехватывает исключение для объектов, может перехватывать и исключения производных типов.

Если в функции инициализируется исключение, тип которого не совпадает с типом ни одного обработчика, то вызывается функция unexpected(), которая в свою очередь, вызывает terminate(), а terminate() – функцию abort() для завершения программы.

68.Обработчик исключений.

Поцедура обработки исключений определяется ключевым словом catch, вслед за которым в скобках помещена спецификация исключения, а затем в фигурных скобках следует блок обработки исключения. Эта процедура должна быть помещена непосредственно после контролируемого блока. Каждая процедура может обрабатывать только одно исключение заданного или преобразуемого к заданному типа, который указан в спецификации ее параметра. Рассмотрим возможные преобразова ния при отождествлении исключения с процедурой обработки исключений. Стандартная схема:

try { // Произвольный код, порождающий исключения X. }

catch (T х) { // Некоторые действия, возможно с х. }

Здесь определена процедура обработки для объекта типа T.

Если исключение X есть объект типа T, T&, const T или const T&, то процедура соответствует этому объекту X. Кроме того, соответствие между исключением X и процедурой обработки устанавливается в тех случаях, когда Tи X - одного типа; T -доступный в точке порождения исключения базовый класс для X; T -тип "указатель" и X - типа "указатель", причем X можно преобразовать к типу T путем стандартных преобразований указателя в точке порождения исключения.

Просмотр процедур обработки исключений производится в соответствии с порядком их размещения в программе. Исключение обрабатывается некоторой процедурой в случае, если его тип совпадает или может быть преобразован к типу, обозначенному в спецификации исключения. При этом необходимо обратить внимание, что если один класс (например, ALPHA) является базовым для другого класса (например, BETA), то обработчик исключения BETA должен размещаться раньше обработчика ALPHA. В противном случае обработчик исключения BETA не будет вызван никогда.

class ALPHA();

class BETA: public ALPHA {} ; ……….

void f1()

{

try { ... }

catch (BETA) // Правильно.

{ ... }

catch (ALPHA)

{ ... } . . . . } . . . .

void f2() { ...

try { ... }

catch (ALPHA) // Всегда будет обработан и объект класса

{ ... // BETA, т.к. "захватываются" исключения

... } // классов ALPHA и всех порожденных от него.

catch (BETA) // Неправильно: заход в обработчик невозможен!

{ ... } . . . .

}