Под исключительной ситуацией, или исключением (exception), понимают прерывание нормального потока программного управления в ответ на непредвиденное или аварийное событие. Исключение может порождаться ошибками, такими, как деление числа на нуль или обращением к памяти по недействительному адресу. В качестве ответа на ошибку функция, в которой возникла ошибка, инициирует (возбуждает) исключение оператором throw, за которым следует значение. Это значение может бытъ константой, переменной или объектом и предназначено для передачи информации обработчику исключения об исключении.
Обработчик исключения начинается ключевым словом 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() для завершения программы.