Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 20.2. Множественные исключения






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 xTooBig { };

27: class xTooSmall { };

28: class xZero { };

29: class xNegative { };

30: private:

31: int *pType;

32: int itsSize;

33: };

34:

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

36: {

37: int size = GetitsSize();

38: if (offSet > = 0J, & offSet < GetitsSize())

39: return pType[offSet];

40: throw xBoundary();

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

42: }

43:

44:

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

46: {

47: int mysize = GetitsSize();

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

49: return pType[offSet]

50: throw xBoundary();

51:

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

53: }

54:

55:

56: Array:: Array(int size):

57: itsSize(size)

58: {

59: if (size == 0)

60: throw xZero();

61: if (size < 10)

62: throw xTooSmall();

63: if (size > 30000)

64: throw xTooBig();

65: if (size < 1)

66: throw xNegative();

67:

68: pType = new int[size];

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

70: pType[i] = 0;

71: }

72:

73:

74:

75: int main()

76: {

77:

78: try

79: {

80: Array intArray(0);

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

82: {

83: intArray[j] = ];

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

85: }

86: }

87: catch (Array:: xBoundary)

88: {

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

90: }

91: catch (Array:: xTooBig)

92: {

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

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: catch (...)

105: {

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

107: }

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

109: return 0;

110: }

 

Результат:

You asked for an array of zero objects!

Done

 

Анализ: В строках 26—29 создается четыре новых класса: xTooBig, xTooSmall, xZero и xNegative. В строках 56—71 проверяется размер массива, переданный конструктору. Если он слишком велик или мал, а также отрицательный или нулевой, генерируется исключение.

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

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

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал