Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Написание обработчиков исключительных ситуаций




Объявления исключительных ситуаций

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

Эта форма особенно важна для библиотек функций, в которых д.б. обработаны все возможные состояния ошибок.

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

void AnyFunction() throw(Error);

Следующее за именем функции и списком параметров (пустым в данном случае) выражение throw() ука­зывает, что функция AnyFunction() может возбуждать исключительные ситуации типа Error. Подобное объяв­ление указывает компилятору, что функции AnyFunctionO не разрешается возбуждать исключительные си­туации других типов.

Если обнаружена функция, объявленную таким способом, не придется охо­титься за операторами throw в теле функции для того, чтобы найти все возможные типы исключительных си­туаций. Объявление говорит вам о том, что функция AnyFunctionO возбуждает исключительную ситуацию типа класса Error.

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

void AnyFunction() throw(Error, char*, OtherType);

В предыдущем листинге EXCEPT.СРР обрабатываются все возможные исключительные ситуации, однако при обнаружении ошибки программа завершается. Несомненно, будет лучше, если операторы, вызвавшие ис­ключительную ситуацию в программе, будут повторяться, чтобы пользователь мог ввести корректные значения. В следующей модифицированной программе также демонстрируется, как писать код, обрабатываю­щий все возможные исключительные ситуации, даже те, которые не ожидались вовсе, возбуждаемые плохо документированными библиотечными функциями. Скомпилируйте и запустите листинг 15.17, как вы это уже делали с предыдущим листингом (из DOS или в виде EasyWin-приложения). Введите неверные значения в ответ на запросы программы. На рис. 15.1 демонстрируется результат работы программы.

 

Листинг 15.17. ЕХСЕРТ2.СРР (обработка ошибок с помощью исключительных ситуаций)

// Демонстрация обработки ошибок с помощью исключительных ситуаций

«include <iostream.h> «include <math.h>

// Неполное объявление класса исключительных ситуаций, необходимое // для того, чтобы на него могла сослаться функция Power()

class Error;

// Прототипы функций (отметьте объявленную ситуацию в функции Power)

void InstructO;

void Run();

double Pow(double b, double e);

double Power(double b, double e) throw(Error);

// Полное объявление класса объектов исключительной ситуации

class Error {

double b; // Base

double e; // Exponent public:

Error() { cout «"Error in source code!" «endl; }

Error(double bb, double ее): b(bb), e(ee) { }

void ReportQ;

};

int main()

InstructO;

for (;;)

{ try {

Run();

cout «"Program is ending normally." «endl;

return 0; // Только если не было исключительных ситуаций

catch (...) { cout «"Error detected: Try again!" «endl;

}

}

}

Void Instruct(){

cout << "Power Demonstration\n\n";

cout «"This program displays the result of raising\n";

cout «"a value (base) to a power (exponent). To\n";

cout << "force an exception, enter a negative base\n";

cout «"and a fractional exponent (e.g. -4 and 1.5)\n";

cout «"Or, enter a zero base and an exponent less than\n";

cout «"zero.\n\n";

// Выполнить программ (повторно вызывается из main ())

void Run() { try {

double base, exponent, result;

cout «"base? ";

cin» base;

cout << "exponent? ";

cin >> exponent;

result = Power(base, exponent);

cout << "result == " «result << endl;

>

catch (Error& e) {

e.Report(); // Отобразить сообщение об ошибке throw e; // Передать исключительную ситуацию в место вызова

}

// Подфункция для Power double Pow(double b, double e) { return exp(e * log(b));

// Возвести b в степень е

double Power(double b, double e) throw(Error)

if (b > 0.0) return Pow(b, e);

if (b < 0.0) {

double ipart;

double fpart = modf(e, &ipart);

if (fpart == 0)

{ if (fmod(ipart, 2)!= 0) // т.о. ipart - дополнение

return -Pow(-b, e); else

return Pow(-b, e); } else

throw Error(b, e);

} else {

if (e == 0.0) return 1.0;

if (e < 1.0) throw Error(b, e); return 0.0;

// Реализация функции-члена ReportO класса Error()

// Отобразить значения, вызвавшие исключительную ситуацию

void

Error:: ReportO

cout «"Domain error:"

«" base:" «b

«" exponent:" << e

«endl;

В приведенном листинге по сравнению с предыдущим сделано несколько модификаций. Во-первых, в нем сделано неполное объявление класса в строке 8. Это позволяет функциям ссылаться на класс, даже ес­ли на данном этапе объявлено только его имя. Например, функция PowerO использует выражение throw для сигнализации о том, что она может посылать объект исключительной ситуации класса Error (и только объект этого класса).

После прототипов функций в программе объявление класса Error завершается. Это тот же класс, который использовался в первоначальном листинге.




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 314; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.013 сек.