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

Содержание статьи:

Введение.
Инициирование исключений.
Синтаксис перехвата исключений.
Многоуровневые исключения и выполнение программы после обработки исключения.

Введение.

к началу статьи
Привет всем. Как видите, я сподобился на ещё одну статью по С++. Будет она посвящена исключениям. Нет-нет, не исключениям из правил, а системе управления поведением программы, при возникновении некорректных ситуаций в процессе её [программы] выполнения. Как такие ситуации перехватывались в старом добром С? Просто писали (например):
int 	*ptr;
ptr = ( int * )malloc( 4 );
if( ptr ){
	printf(“A-a-a-a-a-a!!!”);
	getch();
	exit( 0 );
}

Сейчас же, когда программы стали очень большими и навороченными, просто выхода из программы по exit’у не достаточно. Надо хотя бы освободить ресурсы (помимо этого мы можем захотеть сделать что-нибудь ещё). Можно конечно передавать всем функциям, которые у нас есть механизм корректного завершения программы, но есть способ лучше: вызывать функцию наподобие SendMessage, а затем засесть за написание огромного обработчика ВСЕХ возможных исключительных ситуаций. Представляете, какой получится монстр? Правильно мыслите – есть способ ещё лучше! Использование исключений!

Инициирование исключений.

к началу статьи
Инициирование осуществляется с помощью секции throw.
void		f( void ) {
	throw( 1.1 );
}
throw могут передаваться любые типы данных: стандартные типы данных, типы данных, определенные пользователем, указатели, перечисления, объекты классов и структур.

Синтаксис перехвата исключений.

к началу статьи
Для перехвата исключения необходимо блок, в котором оно возникает поместить в секцию try, а затем поставить несколько секций catch в которых вызванные исключения будут обрабатываться.
void		f( float f ){
	char		Number[100];
	try{
		if( f < 5 )
			throw( ( int )1 );
		else
			throw( 1.1 );
	}
	catch( int i ){
		MessageBox( 0 , _gcvt( i , 9 , Number ) , 0 , 0 );
	}
	catch( double d ){
		MessageBox( 0 , _gcvt( d , 9 , Number ) , 0 , 0 );
	}
}
В данном случае у нас две секции catch. В одной обрабатываются исключении с типом int, а в другой с типом double. Если же Вам хочется написать для всех типов один обработчик, то это можно сделать следующим способом:
void		f( float f ){
	char		Number[100];
	try{
		if( f < 5 )
			throw( ( int )1 );
		else
			throw( 1.1 );
	}
	catch(...){
		MessageBox( 0 , 0 , 0 , 0 );
	}
}

Многоуровневые исключения и выполнение программы после обработки исключения.

к началу статьи
Если в блоке try не было инициировано ни одного исключения, то все обработчики будут проигнорированы и выполнение программы продолжится, если же исключение было вызвано, то выполняется код соответствующего обработчика (из всего списка определённых обработчиков будет выполнен только он), после чего либо продолжится выполнение программы, либо в обработчике будет инициировано новое исключение:
void		f( float f ){
	try{
		try{
			if( f < 5 )
				throw( ( int )1 );
			else
				throw( 1.1 );
		}
		catch(...){
			MessageBox( 0 , "..." , 0 , 0 );
			throw ( NULL );
		}
	}
	catch( int ){
		MessageBox( 0 , 0 , 0 , 0 );
	}
}
Такая обработка исключений возможна, но я настоятельно рекомендую использовать её как можно реже. На этом я считаю тему исключений исчерпанной. Вряд ли у Вас возникнут вопросы... Ну, можете просто так написать мне :) Адрес не изменился dodonov_a_a (___AT_) inbox.ru

к началустатьи


Смежные вопросы:
Урок 1. Основы классов.
Урок 2. Конструкторы копий, оператор присваивания.
Урок 3. Перегрузка функций.
Урок 4. Друзья.
Урок 5. Перегрузка операторов.
Урок 6. Наследование (часть первая).
Урок 7. Наследование (часть вторая).
Урок 8. Шаблоны.
Урок 9. Потоки ввода/вывода.
© 2004-2005 Savardge.ru


Hosted by uCoz