Чтение онлайн

на главную - закладки

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

За блоком try следует несколько операторов catch для каждой исключительной ситуации, кроме исключения, связанного с передачей отрицательного размера. Данное исключение перехватывается оператором catch(. ..) в строке 104.

Опробуйте эту программу с рядом значений для размера массива. Затем попытайтесь ввести значение -5. Вы могли бы ожидать, что будет вызвано исключение xNegative, но этому помешает порядок проверок, заданный в конструкторе: проверка size < 10 выполняется

до проверки size < 1. Чтобы исправить этот недостаток, поменяйте строки 61 и 62 со строками 65 и 66 и перекомпилируйте программу.

Наследование исключений

Исключения — это классы, а раз так, то от них можно производить другие классы. Предположим, что нам нужно создать класс xSize и произвести от него классы xZero, xTooSmall, xTooBig и xNegative. В результате для одних функций можно установить перехват ошибки xSize, а для других — перехват типов ошибок, произведенных от xSize. Реализация этой идеи показана в листинге 20.3.

Листинг 20.3. Наследование исключений

1: #include <iostream.h>

2:

3: const int DefaultSize = 10;

4:

5: class Array

6: {

7: public:

8: // конструкторы

9: Array(int itsSize = DefaultSize);

10: Array(const Array &rhs);

11: ~Array { delete [] pType;}

12:

13: // операторы

14: Array& operator=(const Array&);

15: int& operator[](int offSet);

16: const int& operator[](int offSet) const;

17:

18: // методы доступа

19: int GetitsSize const { return itsSize; }

20:

21: // функция-друг

22: friend ostream& operator<< (ostream&, const Array&);

23:

24: // определения классов исключений

25: class xBoundary { };

26: class xSize { };

27: class xTooBig : public xSize { };

28: class xTooSmall : public xSize { };

29: class xZero : public xTooSmall { };

30: class xNegative : public xSize { };

31: private:

32: int *pType;

33: int itsSize;

34: };

35:

36:

37: Array::Array(int size):

38: itsSize(size)

39: {

40: if (size — 0)

41: throw xZero;

42: if (size > 30000)

43: throw xTooBig;

44: if (size <1)

45: throw xNegative;

46: if (size < 10)

47: throw xTooSmall;

48:

49: pType = new int[size];

50: for (int i = 0; i<size; i++)

51: pType[i] = 0;

52: }

53:

54: int& Array::operator[](int offSet)

55: {

56: int size = GetitsSize;

57: if (offSet >= 0 && offSet < GetitsSize)

58: return pType[offSet];

59: throw xBoundary;

60: return pType[0]; //

требование компилятора

61: }

62:

63:

64: const int&Array::operator[](int offSet) const

65: {

66: int mysize = GetitsSize;

67: if (offSet >= 0 && offSet < GetitsSize)

68: return pType[offSet];

69: throw xBoundary;

70:

71: return pType[0]; // требование компилятора

72: }

73:

74: int main

75: {

76:

77: try

78: {

79: Array intArray(0);

80: for (int j = 0; j< 100; j++)

81: {

82: intArray[j ] = j;

83: cout << "intArray[" << j << "] okay...\n";

84: }

85: }

86: catch (Array::xBoundary)

87: {

88: cout << "Unable to process your input!\n";

89: }

90: catch (Array::xTooBig)

91: {

92: cout << "This array is too big...\n";

93: }

94:

95: catch (Array::xTooSmall)

96: {

97: cout << "This array is too small...\n";

98: }

99: catch (Array::xZero)

100: {

101: cout << "You asked for an array";

102: cout << " of zero objects!\n";

103: }

104:

105:

106: catch (.. .)

107: {

108: cout << "Something went wrong!\n";

109: }

110: cout << "Done.\n";

111: return 0;

112: }

Результат:

This array is too small...

Done.

Анализ: Здесь существенно изменены строки 27—30, где устанавливается иерархия классов. Классы xTooBig, xTooSmall и xNegative произведены от класса xSize, а класс xZero — от класса xTooSmall.

Класс Array создается с нулевым размером, но что это значит? Казалось бы, неправильное исключение будет тут же перехвачено! Однако тщательно исследуйте блок catch, и вы поймете, что, прежде чем искать исключение типа xZero, в нем ищется исключение типа xTooSmall. А поскольку возник объект класса xZero, который также является объектом класса xTooSmall, то он перехватывается обработчиком исключения xTooSmall. Будучи уже обработанным, это исключение не передается другим обработчикам, так что обработчик исключений типа xZero никогда не вызывается.

Поделиться:
Популярные книги

Ваше Сиятельство 6

Моури Эрли
6. Ваше Сиятельство
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 6

Отморозок 3

Поповский Андрей Владимирович
3. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 3

Сонный лекарь 7

Голд Джон
7. Сонный лекарь
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Сонный лекарь 7

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Назад в ссср 6

Дамиров Рафаэль
6. Курсант
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Назад в ссср 6

Сложный пациент

Рам Янка
5. Доктор, помогите...
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сложный пациент

Небо в огне. Штурмовик из будущего

Политов Дмитрий Валерьевич
Военно-историческая фантастика
Фантастика:
боевая фантастика
7.42
рейтинг книги
Небо в огне. Штурмовик из будущего

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Неправильный красноармеец Забабашкин

Арх Максим
2. Неправильный солдат Забабашкин
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Неправильный красноармеец Забабашкин

Чехов

Гоблин (MeXXanik)
1. Адвокат Чехов
Фантастика:
фэнтези
боевая фантастика
альтернативная история
5.00
рейтинг книги
Чехов

Седьмой Рубеж IV

Бор Жорж
4. 5000 лет темноты
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Седьмой Рубеж IV

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Призыватель нулевого ранга. Том 3

Дубов Дмитрий
3. Эпоха Гардара
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга. Том 3

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца