Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Microsoft visual C++ и MFC

© Александр Фролов, Григорий Фролов
Том 24, М.: Диалог-МИФИ, 1993.

[Назад] [Содеожание] [Дальше]

Обработка исключительных ситуаций XE "исключения"

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

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

В языке Си++ реализованы специальные операторы try XE "try" , throw XE "throw" и catch XE "catch" , предназначенные для обработки ошибочных ситуаций, которые называются исключениями.

Операторы try XE "try" , throw XE "throw" и catch XE "catch"

Оператор try открывает блок кода, в котором может произойти ошибка. Если ошибка произошла, то оператор throw вызывает исключение. Исключение обрабатывается специальным обработчиком исключений. Обработчик исключения представляет собой блок кода, который начинается оператором catch.

Допустим ваше приложение должно вычислять значение выражения res = 100 / (num * (num - 7)). Если вы зададите значение переменной num, равное 0 или 7, то произойдет ошибка деления на нуль. Участок программы, в котором может случиться ошибка, объединим в блок оператора try. Вставим перед вычислением выражения проверку переменной nem на равенство нулю и семи. Если переменная num примет запрещенные значения, вызовем исключение, воспользовавшись оператором throw.

Сразу после блока try поместите обработчик исключения catch. Он будет вызываться в случае ошибки.

Пример такой программы, получившей название Exception, мы привели в листинге 1.1. Программа Exception принимает от пользователя значение переменной num, а затем вычисляет выражение res = 100 / (num * (num - 7)) и отображает полученный результат на экране.

В случае, если пользователь введет число 0 или 7, тогда вызывается исключение throw. В качестве параметра оператору throw указывается переменная num. Заметим, что так как переменная num имеет тип long, считается что данное исключение также будет иметь тип long.

После вызова оператора throw управление сразу передается обработчику исключения соответствующего типа. Определенный нами обработчик отображает на экране строку "Exception, num = ", а затем выводит значение переменной num.

После обработки исключения, управление не возвращается в блок try, а передается оператору, следующему после блока catch данного обработчика исключения. Программа выведет на экран строку “Stop program” и завершит свою работу.

Если пользователь введет разрешенные значения для переменной num, тогда исключение не вызывается. Программа вычислит значение res и отобразит его на экране. В этом случае обработчик исключения не выполнится и управление перейдет на оператор, следующий за блоком обработки исключения. Программа выведет на экран строку “Stop program” и завершит работу.

Листинг 1.1. Файл Exception.cpp


#include 

int main()
{
	long	num = 7;
	long	res = 0;
	
	// Введите число num
	cout << "Input number: ";
	cin >> num;

	// Блок try, из которого можно вызвать исключение
	try {
		if((num == 7) || (num == 0))

	// Если переменная num содержит значение 0 или 7,
	// тогда вызываем исключение типа float
			throw num;

	// Значения num равные 0 или 7 вызовут ошибку 
	// деления на нуль в следующем выражении
		res = 100 / (num * (num - 7));

	// Отображаем на экране результат вычисления
		cout << "Result = " << res << endl;
	}

	// Обработчик исключения типа float
	catch(long num)
	{
		// Отображаем на экране значение переменной num
		cout << "Exception, num = " << num << endl;
	}

	cout << "Stop program" << endl;
	return 0;
}

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


catch(long)
{
	// Отображаем на экране значение переменной num
	cout << "Exception, num = " << num << endl;
}

Универсальный обработчик исключений

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


catch(...)
{
	...
}

Исключения в языке Си++ могут быть различного типа, в том числе они могут быть объектами классов. Вы можете определить несколько обработчиков исключений различного типа. В этом случае исключение будет обрабатывать обработчик соответствующего типа.

Тип исключения

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

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


#include 
#include 
#include 

void FastExit(void);

int main()
{
	// Устанавливаем функцию term_func
	set_terminate(FastExit);

	try
	{
		// ...

		// Вызываем исключение типа int
		throw (int) 323; 

		// ...
	}
	
	// Определяем обработчик типа char. Обработчик исключений 
	// типа int и универсальный обработчик не определены
	catch(char)
	{
		cout << "Exception " << endl;
	}
	return 0;
}

// Определение функции FastExit
void FastExit()
{ 
	cout << "Exception handler not found" << endl;
	exit(-1);
}

Среда Visual C++ версии 4.0 позволяет запретить или разрешить обработку исключений языка Си++. Для управления исключениями выберите из меню Build строку Settings. На экране появится диалоговая панель Project Settings, в которой определяются все режимы работы. Выберите страницу C/C++. Затем из списка Category выберите строку C++ Language. Чтобы включить обработку исключительных ситуаций установите переключатель Enable exception handling.

[Назад] [Содеожание] [Дальше]