Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 252

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 246 247 248 249 250 251 < 252 > 253 254 255 256 257 258 .. 341 >> Следующая


Исключения и класс Distance

В качестве еще одного примера технологии исключений рассмотрим ее применение к уже родному классу Distance. Объекты этого класса по-прежнему состоят из целочисленных значений футов и значений дюймов типа float. При этом число дюймов не должно превышать 12,0. Проблема этого класса в предыдущих программах заключалась в том, что невозможно было защититься от ввода пользователем неправильного значения дюймов. Это могло приводить к некорректности данных, получаемых в результате выполнения арифметических операций, так как в этих операциях предполагалось, что значения дюймов все-таки меньше 12,0. Недопустимые значения тоже могли быть выведены, а пользователь мог впасть в легкий ступор наедине с форматом 7'-15".

Перепишем теперь класс Distance таким образом, чтобы можно было использовать механизм исключений для обработки ошибок.

Листинг 14.10. Программа XDIST

// xdist.cpp

// Исключения и класс Distance !include <iostream> using namespace std:

///////////////////////////////////////////////////////////

class Distance //класс английских мер расстояний

{

private: int feet: float inches: public:

class InchesEx { }: //класс исключений

//.........................................................

DistanceO //конструктор (без аргументов) { feet - 0: inches = 0.0: } //.............................. ...................

Distance(int ft. float in) //конструктор (2 арг-та) {

IfCIn >- 12.0) //если дюймы указаны неверно.

throw InchesExO; //генерировать исключение feet = ft:

inches - in; } Исключения 669

//.........................................................

void getdistO //получить длину от пользователя

{

cout « "\nEnter feet: ": сіп » feet: cout « "Enter inches: ": сіп » inches: іf(іnches >= 12.0) //если дюймы неправильные, throw InchesExO; //генерировать исключение

}

// .................

void showdistO //вывод расстояний

{ cout « feet « "V-" « inches « }

}:

ІІІІІШІІІІІ/ІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІІ

int mainO

{

try {

Distance di st1(17. 3.5): //конструктор (2 аргумента) Distance dist2: //конструктор (5ез аргументов)

dist2.getdistО : //получить расстояние

//вывести расстояния cout « "\ndistl = ": distl.showdistO:

cout « "\ndist2 » ": dist2.showdistO: }

catch(Distance::InchesEx) //поймать исключения {

cout « "\п0ши5ка инициализации: "

"значение дюймов превышает предельно допустимое.":

}

cout « endl:

return 0:

}

Итак, разберемся с этой программой. Здесь мы создали класс исключений, называемый InchesEx, для класса Distance. При любой попытке пользователя ввести неправильное значение генерируется исключение. Так случается в двух местах: в конструкторе аргументов, где программист может неверно задать инициализирующие значения, а также в функции getdist(), где пользователь может ввести ошибочные данные в ответ на просьбу ввести дюймы. Можно проверять таким способом, например, случайный ввод отрицательных значений, да и другие ошибки ввода.

В main() все взаимодействия с объектами Distance заключены в блок повторных попыток, а блок-ловушка выводит сообщение об ошибках.

В серьезно разрабатываемых программах, конечно, можно обрабатывать ошибки пользователя (как бы противопоставляя их ошибкам программиста) по-другому. Более приемлемо, с точки зрения пользователя, было бы, например, не выходить из программы и не просто выводить строку сообщения об ошибке, а возвращаться на начало блока повторных попыток. Собственного говоря, это блок так и называется из-за того, что запуск программы после сбоя в общем случае может производиться с него. Так вот, если вернуться к началу этого блока повторных попыток, то пользователю тем самым может быть дан шанс ввести правильное значение дюймов. 670

Глава 14. Шаблоны и исключения

Исключения с аргументами

А что, если приложению нужно больше информации о том, что привело к возникновению исключительно ситуации? Например, в программе XDlSl может понадобиться выяснить, какие именно значения дюймов были введены. Далее, если, например, одно и то же исключение генерируется разными методами класса, то бывает важно выяснить, кто же виновник того, что произошла ошибка. Может быть, существует какой-то способ передать такую информацию от метода, где было сгенерировано исключение, к приложению, которое его поймало?

На этот вопрос можно ответить, если вспомнить, что генерация исключения включает в себя не только передачу управления обработчику, но и создание объекта класса исключений с помощью вызова его конструктора. Например, в XDIST мы создаем объект типа InchesEx при генерации исключения с помощью выражения

throw InchesExO:

Если мы добавляем компонентные данные к классу исключений, мы можем их инициализировать при создании объекта. Обработчик исключений затем может извлечь данные из этого объекта при поимке исключения. С таким же успехом можно сделать какую-нибудь надпись на футбольном мяче и перекинуть его приятелю через забор. Немного модифицируем программу XDIST, чтобы продемонстрировать вышесказанное.
Предыдущая << 1 .. 246 247 248 249 250 251 < 252 > 253 254 255 256 257 258 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100