Студопедия

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

Разделы сайта

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






  • Листинг 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 и перекомпилируйте программу.

     






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.