Навигация
Главная
Поиск
Форум
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
Подключение Mic... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Организация зап... 64601
Создание потоко... 61592
Модуль Forms 61229
Создание отчето... 61174
ТЕХНОЛОГИИ ДОСТ... 57621
Пример работы с... 55124
Имитационное мо... 53014
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

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

Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы
Лабораторная работа по динамическим спискам на Turbo Pascal (удаление ду...
Моделирование работы узла коммутации сообщений на GPSS + Пояснительная з...

Реклама



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

ПОДПИСЫВАЙСЯ на канал о программировании
Классы и исключения
Исключения предоставляют прекрасный механизм решения проблем, связанных с ошибками при выполнении конструкторов и перегрузке операций. Перепишем конструкторы и операции ранее написанных нами классов. Начнем с класса TStri ng и операции индексирования (см. листинг 4.9). Первое, что требуется определить, — это типы исключений. Не будем пользоваться стандартными встроенными типами, а определим собственный тип с «говорящим» названием. Воспользуемся возможностью объявлять внутри класса вложенный класс и объявим в открытой части класса TString пустой класс-исключение, например:
class bad_Index {};



Теперь мы сможем генерировать объекты-исключения типа bad_Index всякий раз, когда индекс символа окажется вне допустимого диапазона 0-254.
Перепишем сначала методы индексирования — теперь мы можем обрабатывать ошибку индексирования одинаково в обоих методах: так как нам нужно только сообщить клиенту об аварии, функция должна только генерировать исключение, а перехватывать и обрабатывать его будет программа-клиент. С учетом этих соображений новый текст методов индексирования представлен в листинге 7.4.
Листинг 7.4. Операция индексирования с генерацией исключений
char& operator[](const byte &index)
{ if (index<255) return s[index]; // правильный индекс
else throw bad_Index(); // аварийное завершение
}
const char& operator[](const byte &index) const
{ if (index<255) return s[index]; // правильный индекс
else throw bad_Index(); // аварийное завершение




Где-то в программе-клиенте, которая использует наш класс TStгing, должны быть написаны такие строки:
try { //...
Tstring ss; // создаем объект-строку
//. . .
...ss[1]... // контролируется!
//... }
catch (TString::bad_Index) // no типу
{ cout << "Ошибка! Индекс символа вне диапазона [6,254]!" << endl; //...
}
//. ..



Как обычно, тип исключения (в заголовке секции-ловушки) требуется писать с префиксом-именем класса, в котором этот тип определен.
Теперь проанализируем конструкторы класса TSt г i ng. Очевидных претендентов на генерацию исключения bad_Index два — те, которые имеют аргумент-индекс (см. листинги 4.6 и 4.7). Текст модифицированных конструкторов представлен в листинге 7.5.

Листинг 7.5. Конструкторы класса TString с генерацией исключения badjndex
TString::TString(const char S[], byte index, byte count)
{ if (index4255) // проверка индекса
{ TString t(S+index, S+index+count); *this = t;
}
else throw bad_Index(); // аварийное завершение
}
TString::TString(const TString &S, byte index, byte count)
{ if (index<255) // проверка индекса
{ TString t;
if ((count > S.size)11 // проверяем количество
(index+count > S.size))
t.size = S.size-index; // неправильное количество
else t.size = count; // правильное количество
if (t.size>9)
memcpy(t.s,(S.s+index),t.size); // копируем строку
*this = t; // заменяем текущий
}
else throw bad_Index(); // аварийное завершение
}



Теперь при создании объекта с помощью этих конструкторов индекс будет контролироваться, и в случае неправильного значения генерируется исключение. Заметьте, что таким образом мы контролируем очень многие методы и операции — ведь они выполняют свою работу, создавая локальные объекты с помощью одного из этих конструкторов.
Для получения дополнительной ин4юрмации о том, в какой из функций произошла ошибка, мы, конечно, должны определить в качестве исключения более развитый класс с конструктором. Можно, конечно, контролировать и параметр count, но для строк особого смысла в этом нет, так как мы просто усекаем строку до 255 символов.
Если вам необходимо связаться с людьми по написанию программы то вам идеально подойдет http://www.videomost.com/.
Но нам потребуется еще один тип исключений — для проверки диапазона указателей в конструкторе:
TString(const char *First, const char *Last):



Назовем этот тип исключения bad_Range. Тогда новый вид конструктора будет таким, как показано в листинге 7.6.
Опубликовал Kest November 11 2013 04:54:54 · 0 Комментариев · 1638 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Библия для програ...
CaptionButton
Программирование ...
Игра "Астероиды" ...
Самоучитель PHP 5...
PDJXPPack
Мод "проверочный ...
Delphix Sample [И...
Советы по Delphi
Добавление басса ...
Сапёр
PolyFlow
Пример клиента ФТ...
Конвертирование и...
Анимированное поя...
FilesInfo
IIIDTrans
RbControls
Delphi Russian Kn...
Borland Delphi 8 ...

Топ загрузок
Приложение Клие... 100384
Delphi 7 Enterp... 83515
Converter AMR<-... 20051
GPSS World Stud... 11297
Borland C++Buil... 11233
Borland Delphi ... 8175
Turbo Pascal fo... 6987
Visual Studio 2... 4970
Калькулятор [Ис... 4416
FreeSMS v1.3.1 3516
Случайные статьи
Выделение трех объ...
Viking Botovod или...
Снова об интерфейс...
Упорядоченные деревья
Анализ издержек
Первый шаг в постр...
ПРИМЕРЫ ЗАПИСИ ПРИ...
Процедура итерацио...
Освоение приложени...
Сбор данных с прим...
При строгом соблюд...
Перекодирование ис...
Ландшафтный дизайн
Данная книга
В Windows 2000 Ser...
Линейная задача
Международный алго...
Применяйте естеств...
Модуль Server-side...
Способы обнаружени...
Алгоритмы поиска в...
Размеры блока
Интервью с сотовым...
Поиск суммы элемен...
чтения смарт-карт,...
Статистика



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


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