С++ для начинающих



         

Try-блок - часть 3


int main() {

   try {

      iStack stack( 32 );    // правильно: объявление внутри try-блока

      stack.display();

      for ( int ix = 1; ix < 51; ++ix )

      {

          // то же, что и раньше

      }

   }

   catch ( pushOnFull ) {

      // здесь к переменной stack обращаться нельзя

   }

   catch ( popOnEmpty ) {

      // здесь к переменной stack обращаться нельзя

   }

   // и здесь к переменной stack обращаться нельзя

   return 0;

}

Можно объявить функцию так, что все ее тело будет заключено в try-блок. При этом не обязательно помещать try-блок внутрь определения функции, удобнее заключить ее тело в функциональный try-блок. Такая организация поддерживает наиболее чистое разделение кода для нормальной обработки и кода для обработки исключений. Например:

int main()

   try {

      iStack stack( 32 );    // правильно: объявление внутри try-блока

      stack.display();

      for ( int ix = 1; ix < 51; ++ix )

      {

          // то же, что и раньше

      }

      return 0;

   }

   catch ( pushOnFull ) {

      // здесь к переменной stack обращаться нельзя

   }

   catch ( popOnEmpty ) {

      // здесь к переменной stack обращаться нельзя

   }

Обратите внимание, что ключевое слово try находится перед фигурной скобкой, открывающей тело функции, а catch-обработчики перечислены после закрывающей его скобки. Как видим, код, осуществляющий нормальную обработку, находится внутри тела функции и четко отделен от кода для обработки исключений. Однако к переменным, объявленным в main(), нельзя обратиться из обработчиков исключений.

Функциональный try-блок ассоциирует группу catch-обработчиков с телом функции. Если инструкция возбуждает исключение, то поиск обработчика, способного перехватить это исключение, ведется среди тех, что идут за телом функции. Функциональные try-блоки особенно полезны в сочетании с конструкторами классов. (Мы еще вернемся к этой теме в главе 19.)

Упражнение 11.3

Напишите программу, которая определяет объект IntArray (тип класса IntArray рассматривался в разделе 2.3) и выполняет описанные ниже действия.

Пусть есть три файла, содержащие целые числа.

1.      Прочитать первый файл и поместить в объект IntArray первое, третье, пятое, ..., n-ое значение (где n нечетно). Затем вывести содержимое объекта IntArray.

2.      Прочитать второй файл и поместить в объект IntArray пятое, десятое, ..., n-ое значение (где n кратно 5). Вывести содержимое объекта.

3.      Прочитать третий файл и поместить в объект IntArray второе, четвертое, ..., n-ое значение (где n четно). Вывести содержимое объекта.

Воспользуйтесь оператором operator[]() класса IntArray, определенным в упражнении 11.2, для сохранения и получения значений из объекта IntArray. Так как operator[]() может возбуждать исключения, обработайте их, поместив необходимое количество try-блоков и catch-обработчиков. Объясните, почему вы разместили try-блоки именно так, а не иначе.




Содержание  Назад  Вперед