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

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

Диплом - база данных поставщиков на Delphi (MS Sql Server)+ Пояснительна...
База данных студентов на 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 Комментариев · 1906 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
WebReg v1.3
Visual Basic Script
Распознавание тек...
Пример работы с б...
ShadelLabel
FreeNet
Zoom [Исходник на...
SysInfo [Исходник...
Delphi 2005 Секре...
isoCanvas (Редакт...
Распознавание иде...
SUIPack
32 урока по Delphi
Swing. Эффектные...
DemoEdit [Исходни...
Программа "AutoRu...
Доступа к БД Fire...
XPATComponents
PHP/MySQL для нач...
Добавление к ссы...

Топ загрузок
Приложение Клие... 100501
Delphi 7 Enterp... 89100
Converter AMR<-... 20087
GPSS World Stud... 14209
Borland C++Buil... 12394
Borland Delphi ... 8808
Turbo Pascal fo... 7068
Калькулятор [Ис... 5025
Visual Studio 2... 5011
FreeSMS v1.3.1 3550
Случайные статьи
Применение нового ...
Зарезервированные ...
Дуплексный протоко...
Как вставить растр...
От издательства
using reversible р...
Перемещение объект...
Функция GetSystemI...
Введение в FPDF
ЯЧЕЙКИ В GPSS
Минимизация открыт...
Задание нетипизиро...
Поддерживаемые ком...
10.6. Задачи
Я хочу, чтобы окно...
Создание структуры...
потенциальный пар...
Microsoft - спроси...
Функция GetBkColor...
Маршалер свободной...
Создание стандартн...
Каждый DNS-сервер ...
Создание тестов не...
Язык Ada и военный...
Случайное рехеширо...
Статистика



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


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