Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 7
На сайте нет зарегистрированных пользователей

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

Компьютерный магазин на Turbo Pascal (База данных) + Пояснительная записка
Расчет мер близости на отношениях на Delphi + Пояснительная записка
Метод конечных разностей для интерполяции/экстраполяции на Delphi

Классы и исключения
Исключения предоставляют прекрасный механизм решения проблем, связанных с ошибками при выполнении конструкторов и перегрузке операций. Перепишем конструкторы и операции ранее написанных нами классов. Начнем с класса 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 00:54:54 · 0 Комментариев · 3266 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
PHP 5. Полное рук...
iComm v.6.1 - выв...
Таймер и секундомер
Андрей Боровский....
Экранная лупа
39 статьи по Delphi
Berg
Delphi 2005 Секре...
Delphi Быстрый Ст...
Matrix2D
WAP версия сайта
Animated Menus
«Философия» прогр...
Autorunner
Профессиональное ...
Шейдеры в Delphi
Учебник по создан...
AdBlaster v2.5 - ...
XPButtons
Сапёр

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98017
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14239
Borland Delphi ... 10374
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
Что такое конфигур...
Содержание
Еще три возможност...
Букмекерская конто...
4.3. Принципы
Онлайн игровые авт...
Заблуждения и недо...
Этап 3 - сколемизация
Операции в Прологе
Максимальная разни...
Задачи для проверки
Тема адресации и с...
Установка дистанци...
Контроль доступа
Чтобы заменить дел...
Построение символь...
3.2. АНТИПАТТЕРН: ...
Вулкан клуб онлайн
КОМАНДЫ
Ландшафтный дизайн
Формирование импул...
Коллекция таблиц, ...
Описать объект, вк...
Использование скры...
Создание программ ...
Статистика



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


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