Навигация
Главная
Поиск
Форум
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
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
Имитационное мо... 60089
Реклама
Сейчас на сайте
Гостей: 6
На сайте нет зарегистрированных пользователей

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

Моделирование процесса поступления заявок в систему, состоящую из трёх Э...
Поиск пути в графе заданном списками инцедентности на 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 Комментариев · 1966 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
39 статьи по Delphi
Панель случайной ...
Иллюстрированный ...
PDPcheck
Assistant
45 уроков по дельфи
Размещение элемен...
Функции Visual Basic
PDJXPPack
GPSS World Studen...
Защита от спама ...
Панель "Случайное...
CoolDev TipsSyste...
DelphiX
Шифрование по алг...
около 291 статьи ...
Создание оригинал...
PBEditPack
Введение в станда...
Эффект лампы на р...

Топ загрузок
Приложение Клие... 100519
Delphi 7 Enterp... 91117
Converter AMR<-... 20098
GPSS World Stud... 15141
Borland C++Buil... 12880
Borland Delphi ... 9073
Turbo Pascal fo... 7105
Калькулятор [Ис... 5156
Visual Studio 2... 5028
FreeSMS v1.3.1 3557
Случайные статьи
Кодирование
13.8. Примеры поиска
Динамическая компо...
Сигналы. Знакомств...
Конечная область п...
Польза гвоздики
Выбор атмосферы съ...
Сравнение ADO.NET ...
Что является станд...
Трансивер MAU
При перегрузке опе...
Массивы и классы, ...
Работа с WDDX в РНР
Каковы шансы у про...
Поддержка 32-битны...
Аудит также позвол...
Просмотр списка по...
Matrix: операторы ...
Увеличение быстрод...
• Массивы Кернигана
и оставить только ...
The profit of gamb...
Подсчет времени ра...
Протокол RPC
Как в выбранной яч...
Статистика



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


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