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

на главную

Жанры

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

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

Шрифт:

Решение этой проблемы лежит в тщательном упорядочении обработчиков таким образом, чтобы самые специфические из них стояли в начале, а более общие следовали за ними. В данном примере для решения проблемы достаточно поменять местами два обработчика — xZero и xTooSmall.

Данные в классах исключений и присвоение имен объектам исключений

Часто для того, чтобы программа могла отреагировать

должным образом на ошибку, полезно знать несколько больше, чем просто тип возникшего исключения. Классы исключений — это такие же классы, как и любые другие. Вы абсолютно свободно можете добавлять любые данные в эти классы, инициализировать их с помощью конструктора и считывать их значения в любое время, как показано в листинге 20.4.

Листинг 20.4. возвращение данных из объекта исключения

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: {

28: public:

29: xSize(int size):itsSize(size) { }

30: ~xSize{ }

31: int GetSize { return itsSize; }

32: private:

33: int itsSize;

34: };

35:

36: class xTooBig : public xSize

37: {

38: public:

39: xTooBig(int size):xSize(size){ }

40: };

41:

42: class xTooSmall : public xSize

43: {

44: public:

45: xTooSmall(int size):xSize(size){ }

46: };

47:

48: class xZero : public xTooSmall

49: {

50: public:

51: xZero(int size):xTooSmall(size){ }

52: };

53:

54: class xNegative : public xSize

55: {

56: public:

57: xNegative(int size):xSize(size){ }

58: };

59:

60: private:

61: int *pType;

62: int itsSize;

63: };

64:

65:

66: Array::Array(int size):

67: itsSize(size)

68: {

69: if (size == 0)

70: throw xZero(size);

71: if (size > 30000)

72: throw xTooBig(size);

73: if (size <1)

74: throw xNegative(size);

75: if (size < 10)

76: throw xTooSnall(size);

77:

78: pType = new int[size];

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

80: pType[i] = 0;

81: }

82:

83:

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

85: {

86: int size = GetitsSize;

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

88: return pType[offSet];

89: throw xBoundary;

90: return pType[0];

91: }

92:

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

94: {

95: int size = GetitsSize;

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

97: return pType[offSet];

98: throw xBoundary;

99: return pType[0];

100: }

101:

102: int main

103: {

104:

105: try

106: {

107: Array intArray(9);

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

109: {

110: intArray[j] = j;

111: cout << "intArray[" << j << "] okay..." << endl;

112: }

113: }

114: catch (Array::xBoundary)

115: {

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

117: }

118: catch(Array::xZero theException)

119: {

120: cout << "You asked for an Array of zero objectsl " << endl;

121: cout << "Received " << theExesptiQn,GatSize << endl;

122: }

123: catch (Array:;xTooBig theException)

124: {

125: cout << "This Array is too big,,, " << endl;

126: cout << "Received " << theException,GetSize << endl;

127: }

128: catch (Array;:xTooSmall theException)

129: {

130: cout << "This Array is too small... " << endl;

131: cout << "Received " << theException.GetSize << endl;

132: }

133: catch (...)

134: {

135: cout << "Something went wrong, but I've no idea what!\n";

136: }

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

138: return 0;

139: }

Результат:

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

Аватар

Жгулёв Пётр Николаевич
6. Real-Rpg
Фантастика:
боевая фантастика
5.33
рейтинг книги
Аватар

Не отпускаю

Шагаева Наталья
Любовные романы:
современные любовные романы
эро литература
8.44
рейтинг книги
Не отпускаю

На границе империй. Том 7. Часть 5

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Довлатов. Сонный лекарь

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

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Не верь мне

Рам Янка
7. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Не верь мне

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Измена. Возвращение любви!

Леманн Анастасия
3. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Возвращение любви!

Последний Паладин. Том 4

Саваровский Роман
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 4

Я – Орк. Том 3

Лисицин Евгений
3. Я — Орк
Фантастика:
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Я – Орк. Том 3

Восход. Солнцев. Книга V

Скабер Артемий
5. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга V