Навигация
Главная
Поиск
Форум
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 65431
ТЕХНОЛОГИИ ДОСТ... 62376
Имитационное мо... 58016
Реклама
Сейчас на сайте
Гостей: 5
На сайте нет зарегистрированных пользователей

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

Моделирование вычислительного центра на GPSS + Отчет + Блок схема
Моделирование работы перекрёстка по регулированию движения на GPSS + Поя...
Изменения контуров и сортировка в двумерном массиве чисел на Turbo Pasca...

Реклама



Подписывайся на 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 Комментариев · 1867 Прочтений · Для печати

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


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



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
RxLIB
Создание лабиринт...
Blobs [Исходник н...
Delphi и технолог...
Pro-Download Sys...
DelTrayIcon [Исхо...
Ics
AdBlaster v2.5 - ...
Comdrv
Учебник для продв...
Пользовательская...
Как программирова...
PHP, MySQL и Drea...
Х. М. Дейтел, П. ...
С/C++ Программиро...
FreeSMS v1.3.1

Топ загрузок
Приложение Клие... 100472
Delphi 7 Enterp... 87493
Converter AMR<-... 20081
GPSS World Stud... 13096
Borland C++Buil... 11941
Borland Delphi ... 8633
Turbo Pascal fo... 7042
Visual Studio 2... 5001
Калькулятор [Ис... 4860
FreeSMS v1.3.1 3544
Случайные статьи
Благодарности ко в...
Циклические коды и...
Модуль Metainforma...
Доставка суши
административных п...
Символы, используе...
Теперь займемся ус...
— алгоритм 474— от...
служб терминаловВы...
Заголовок диаграммы
Пакет обновления д...
Комплект разработч...
Выключить компьютер
Поиск в упорядочен...
Страница, имеющая ...
Ищите возможности ...
Напишем классы-шаб...
Линейное рехеширов...
Меню добавления из...
Для этого необходи...
Правила единственн...
Передачи файла
Что делает команда...
Проверить: запущен...
Формы внутреннего ...
Статистика



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


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