Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 64262
Модуль Forms 63999
Пример работы с... 61137
ТЕХНОЛОГИИ ДОСТ... 60862
Имитационное мо... 56410
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

Пользователей: 13,080
новичок: setan
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Расчет размера дохода на одного человека в Turbo Pascal
Моделирование работы класса персональных компьютеров на GPSS + Отчет + Б...
Моделирование интернет магазина (Apache, Php, Html) на GPSS + Блок схема

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Применение исключений
Прежде чем переписывать конструкторы и методы разработанных ранее классов с использованием механизма обработки исключений, давайте обратимся к этому механизму для проверки параметров в обычной функции. Пусть нам требуется написать функцию, вычисляющую высоту, опущенную на одну из сторон. Параметрами являются три стороны треугольника, а вычислять нужно высоту, опущенную на сторону, указанную первой. Если параметры-стороны заданы в порядке а, Ь, с, то вычислять надо высоту, опущенную на сторону а. Как известно, высота, опущенная на сторону а, вычисляется по формуле
К ->JP(P а)(р Ь)(р с), а



где р = (а + Ъ + с)/2 — полупериметр треугольника. Квадратный корень представляет собой формулу Герона для вычисления площади треугольника. Таким образом, нам надо проверить, что:
• ни один из параметров (сторона треугольника) не меньше нуля и не равен нулю;
• выполняются неравенства треугольника для любых сочетаний сторон.
Если эти условия не выполняются, то функция должна генерировать исключение, которое является сообщением об ошибке. Вывод этого сообщения должен быть выполнен в блоке catch. Используем тип string, а передавать объект-исключение в секцию-ловушку будем по константной ссылке. Нам требуется решить, кто будет обрабатывать исключение: та же функция, где ситуация возникла, или программа-клиент. Рассмотрим сначала первый вариант (листинг 7.1).
Листинг 7.1. Функция вычисления высоты треугольника с обработкой исключений
double Ha(double a, double b, double с)
{ try { // контролируемый блок
if ((a>0)&&(b>0)&&(c>0)) // если параметры правильные
{ if ((a+b>c)&&(a+c>b)&&(b+c>a)) // если треугольник
{ double р = (a+b+c)/2; // вычисляем высоту
return 2*sqrt(p*(p-a)*(p-b)*(p-c))/a:
}
}
else throw "Неправильный параметр!"; // генерация исключения
} // конец try-блока
catch(const string &s) // обработка исключения
{ cout << s << endl; } y
}
Уже по тексту функции видно, что механизм обработки исключения в данном варианте является «лишним» — можно просто выводить сообщение. Использование исключений в функции существенно усложнило текст. Тем не менее все-таки проверим функцию с помощью простейшей тестовой программы:
int main()
{ cout <<На(3,4,5)<< endl; // выполняется правильно
cout <<На(1,2,3)<< endl; // ничего не выводится!
return 0;
}



Первый оператор выполняется нормально, так как параметры заданы правильные — это стороны прямоугольного треугольника. А вот со вторым оператором возникли проблемы — программа завершается аварийно, но на экран не выводится никаких сообщений, ради которых мы, собственно, и «городили огород» с исключениями! Такое впечатление, что секция-ловушка просто не выполняется.
Так оно и есть на самом деле! Причина состоит в том, что тип генерируемого объекта-исключения не соответствует типу, заявленному в секции-ловушке catch. Операторы throw генерируют объект, тип которого const char *, а в заголовке секции-ловушки заявлен const string&. Преобразования типов по умолчанию, как отмечалось ранее, не выполняются. Если бы преобразования были разрешены, невозможно было бы перехватывать исключение конкретного типа. Поэтому перепишем заголовок блока catch с правильным типом параметра:
catch (const char *s)
Программа заработала, однако на экране появляются «лишние» сообщения:
Не треугольник! -l.#IND



Последнее сообщение появляется из-за того, что мы не возвращаем никакого значения в аварийных случаях. Между тем функция, выполнив блок catch, выполняет операторы после него, а у нас там ничего нет! Первое решение — поставить в функцию после, секции-ловушки оператор
return 0;



Теперь наша тестовая программа выводит на экран два числа: 4 и 0. Однако использование механизма обработки исключений в таком варианте выглядит абсолютно нецелесообразным — гораздо проще сделать все то же самое с помощью обычных операторов i f. Поэтому реализуем другой вариант обработки: функция будет только генерировать исключение, а обрабатывать его будет программа-клиент, в данном случае — наша тестовая программа. Текст функции с программой-клиентом представлен в листинге 7.2.
Листинг 7.2. Функция вычисления высоты треугольника с генерацией исключений
double Ha(double a, double b, double с)
{ if ((a>0)&&(b>0)&&(c>0)) // если параметры правильные
{ if ((a+b>c)&&(a+c>b)&&(b+c>a)) // если треугольник
{ double р = (a+b+c)/2: // вычисление высоты
return 2*sqrt(p*(p-a)*(p-b)*(p-c))/a:
}
else throw "He треугольник!": // генерация исключения
}
else throw "Неправильный параметр!": // генерация исключения
}
int main()
{ try { // контролируемый блок
cout <<На(3,4,5)<< endl: // нормальное вычисление
cout <<На(1,2,3)<< endl: // генерирует исключение
cout <<На(1,0,3)<< endl: // не выполняется!
}
catch(const char *s) // обработка исключения
{ cout << s << endl: } return 0:
}



Обратите внимание на то, что в функции не выполняется возврат «аварийного» значения 0: в данном случае этого не требуется, так как оператор генерации исключения осуществляет выход из функции. При этом выполняется «раскрутка» стека: вызываются все необходимые деструкторы для уничтожения локальных объектов. Поэтому вернуться в функцию после генерации исключения невозможно — разве что заново ее вызвать.
Первый оператор вывода срабатывает нормально. Во время выполнения второго возникает исключение, и управление передается в секцию-ловушку. При этом пропускается третий оператор вывода. Причем мы не можем «вернуться» к его выполнению после выполнения секции-ловушки, даже если пометим его и добавим оператор goto: по стандарту оператор goto не может использоваться для перехода внутрь контролируемого блока. Но можно передать управление на начало блока try и выполнить весь контролируемый блок сначала. Правда, в данном случае — без корректировки параметров во втором вызове — это не изменит поведения программы: третий оператор все равно не будет работать.
Наша функция не имеет спецификации исключений. Наличие спецификации в заголовке никак не изменяет поведения программы, например:
double Ha(double a, double b, double с) throw(const char *)



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

Однако в Visual C++.NET 2003 задание спецификации с другим типом исключения на видимое поведение программы никак не влияет, например:
double Ha(double a, double b, double с) throw(string)



To же самое происходит при полном запрете исключений:
double Ha(double a, double b, double с) throw()



Главное, чтобы генерируемое исключение было где-нибудь перехвачено.
Опубликовал Kest November 11 2013 04:50:47 · 0 Комментариев · 2517 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Библиотека програ...
Развивающийся фла...
Delphi на примерах
PBFoldder
De Knop
Printgrid
index.php + мод ...
Battle.Net - мони...
PHP 5. Полное рук...
База для Allsubmi...
Win-Prolog 3.618
EditButton
Delphi 7: Для про...
Программирование ...
Print Grid
Запрет гостям ск...
Microsoft Press -...
ScreenSaver [Исхо...
Панель статистики...
Программирование ...

Топ загрузок
Приложение Клие... 100455
Delphi 7 Enterp... 86165
Converter AMR<-... 20072
GPSS World Stud... 12525
Borland C++Buil... 11616
Borland Delphi ... 8526
Turbo Pascal fo... 7035
Visual Studio 2... 4992
Калькулятор [Ис... 4744
FreeSMS v1.3.1 3539
Случайные статьи
Эти методы служат ...
Трафик абонентских...
ВВЕДЕНИЕ. МЕСТО ИМ...
HTPC на базе Windows
1. Пропускная спос...
ASSEMBLE (СОЕДИНИТЬ)
согласно требовани...
Борьба с типами фа...
Процедура SetPalet...
В сети Fabrikam ос...
Файловые системы
ключу Для двух исп...
Эталонная модель п...
Видеоинфографика
Поиск минимума фун...
Что может маршрути...
Основы службы подд...
Язык С: операции н...
Идентификаторы в я...
Перегрузка операци...
binary search: клю...
Представление симв...
Как создать решени...
Идеальная структур...
Герметик для дерева
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?