Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Надейкина_ПРОГРАММИРОВАНИЕ_лабы9_10_11_new.doc
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
129.42 Кб
Скачать

Int main () {

try {

runGame();

}

catch(...) {

std::cerr << "Abnormal termination\n";//аварийное завершение

}

saveState(); // сохраняем текущее состояние игрока

return 1;

}

В этом случае, если функция runGame () или любая другая из функций, которые вызываются в runGame (), выбросит исключение, которое не будет поймано функциями в стеке выше, то, в конечном итоге, оно попадет в обработчик catch-all. Это предотвратит завершение выполнения функции main () и даст нам возможность вывести сообщение с указанием ошибки на наше усмотрение, а затем сохранить состояние пользователя до выхода из программы. Это может быть полезно для обнаружения и устранения непредвиденных проблем.

Список исключений функции

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

Механизм объявления функций с указанием того, будет ли функция генерировать исключения (и какие именно) или нет может быть полезен при определении необходимости помещения вызова функции в блок try.

Существуют три типа спецификации исключений.

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

int doSomething () throw () // не выбрасываются исключения

{/* Тело функции */}

Обратите внимание, функция doSomething () все еще может генерировать исключения, только обрабатывать она должна их самостоятельно. Любая

функция, объявленная с использованием throw () (как в вышеприведенном примере), должна немедленно прекратить выполнение программы, если она попытается сгенерировать исключение, которое приведет к раскручиванию стека. Другими словами, мы сообщаем, что все исключения функции doSomething (), функция doSomething () будет обрабатывать самостоятельно.

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

Int doSomething () throw (double, const char*)

// могут генерироваться исключения типа double и const char*

{/* Тело функции */}

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

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

int doSomething () throw(...) // могут генерироваться любые исключения

{/* Тело функции */}

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

Исключения в конструкторах и деструкторах

Язык C++ не позволяет возвращать значение из конструктора и деструктора. Механизм исключений дает возможность сообщить об ошибке, возникшей в конструкторе или деструкторе объекта.

Для иллюстрации создадим класс Vector, в котором ограничивается количество запрашиваемой памяти:

class Vector { public:

class Size { }; // Класс исключения

enum {max = 3200}; // Максимальная длина вектора Vector (int n) { //конструктор

if (n<0 || n>max) throw Size ();

p = new Type [n];

} ~ Vector () {//деструктор

delete [] p;

} …

protected: Type * p; //указатель на первый элемент вектора };

При использовании класса Vector можно предусмотреть перехват исключений типа Size:

try {