Управление исключительными ситуациями. Функции, выдающие исключения

   
На этом шаге мы рассмотрим назначение и использование конструкции throw() в заголовке функции.

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

  • throw() - это означает, что функция может выдавать пустое исключение (т. е. не должна выдавать никакого исключения);
  • throw(...) - это означает, что функция может выдавать любое исключение, которое возникнет при ее вызове;
  • throw (type) - это означает, что функция может выдавать исключение заданного типа.

   Примечание.
Обратите внимание на выделенные слова. Они означают, что, в принципе, содержание функции "настроено" на то, что при ее выполнении может появится исключение только такого типа,
но не означает, что исключения другого типа не могут возникнуть при ее вызове (если программист плохо эту функцию спроектировал). Таким образом, здесь перечисляются исключения, которые может "выбросить" функция сама или вызываемые из нее.
Теоретически это позволяет лучше контролировать исключения и более эффективно их обрабатывать. В реальности разные разработчики компиляторов понимают эту конструкцию несколько по-разному.

   
Следовательно, это именно перечисление возможных исключений.
К сожалению, компилятор не в состоянии проверить это утверждение и вынужден полагаться на программиста. А тот, как правило, cам не имеет возможности правильно их перечислить.
Библиотечные функции описаны без указания исключений, то есть согласно стандарту могут "выбрасывать" любое исключение, следовательно, любая функция, обращающаяся к библиотеке, тоже может
"выбросить" любое исключение, если только не перехватывает их все.

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

// 2010_1.cpp: главный файл проекта.

#include "stdafx.h"

#include <stdlib.h>
#include <stdio.h> 
#include <conio.h>

// Функция, "запрограммированная" на 
// выдачу целочисленных исключений
void f1(int i) throw (int)
{
	//четное число (остаток от деления равен 0)
	if ( i%2 == 0 ) 
		throw 1;  //выдача "целочисленного" исключения
}

// Функция, "запрограммированная" на 
// выдачу исключений любого типа
void f2(int j) throw(...)
{
	f1(j);
}

void main()
{
	for(int j=0; j < 10; j++)
	{
		try 
		{
			f2(j);
		}
		catch(...) {
			printf ("j = %d\n", j); 
		}
	} //for
	_getch(); //задержка экрана
}

Архив проекта можно взять здесь.


Рис.1. Результат работы приложения

   
Дополнительную информацию по обработке исключений можно получить здесь (шаги 1 - 7).

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий