Хелпикс

Главная

Контакты

Случайная статья





Теоретические сведения. Пример 3.1



БДЗ № 3

Исключения в С++

Цель работы: 1) изучить различные способы обработки исключений; 2) получить практические навыки программирования задач с обработкой исключений.

Теоретические сведения

Механизм обработки исключительных ситуаций в С++ предназначен для отслеживания ошибочных вычислительных ситуаций и безопасной реакции программы на них. Традиционно к исключительным ситуациям относятся, например, деление на ноль, вычисление логарифма отрицательного числа, выход за границы массива и т. д. Однако, допустимо использование этого механизма для отслеживания любой вычислительной ситуации.

Синтаксически обработка исключений реализуется с помощью ключевых слов try, catch и throw:

try { /* блок try, где должен находиться оператор, генерирующий исключения */

}

catch (type1 arg1) { /* блок catch перехвата и обработки исключения типа type1 */

}

catch (type2 arg2) { /* блок catch перехвата и обработки исключения типа type2 */

}

catch (typeN argN) { /* блок catch перехвата и обработки исключения типа typeN */

}

Оператор throw должен выполняться либо внутри блока try, либо в любой функции, которую этот блок вызывает:

throw исключительная_ситуация;

Пример 3.1

#include <iostream.h>

const int n=10;

void main()

{ int i;

int mas[n];

try { for(i=0;i<=n;i++) mas[i]=i;

 if (i>=n) throw i;

            if (i<0) throw “Empty array”;

}

//обработка массива согласно алгоритму

catch (int i) {cerr<<”Out of array”;}

catch (char *err) {cerr<<”Index is negative”;}

}

Приведенный пример легко может обойтись без использования синтаксиса обработки исключений.

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

Пример 3.2Создание стека-массива, использующего исключения для отслеживания его верхней и нижней границы.

#include <iostream>

using namespace std;

 

const int RANG = 10; // максимальный размер стека

class Stack

{ int stk[RANG];

   int top;              // индекс вершины стека

public:

   class Range1                 // класс исключений для класса Stack,

        {                               // тело класса пусто

        };

   class Range2                 // класс исключений для класса Stack,

        {                               // тело класса пусто

        };

   Stack() { top = -1; }  // конструктор

   void push(int variable)  // функция помещения данных в стек

   { if (top >= RANG - 1)// если стек заполнен, генерировать //исключение

                   throw Range1();

          stk[++top] = variable;// иначе - протолкнуть число в стек

      }

   int pop()            // функция извлечения данных из стека

      { if (top < 0)  // если стек пуст, генерировать исключение

                   throw Range2();           

          return stk[top--];    // иначе - извлечь число из стека

      }

};               // class Stack

 

int main()

{ Stack s_int;

int INP;

try { for (int i = 0; i < RANG; i++)

            { cout << "Input value";

                cin >> INP;

                s_int.push(INP);

            }

         s_int.push(INP);     // генерация исключения - стек полон

         for (int i = 0; i < RANG; i++)

             cout << i + 1 << ':' << s_int.pop() << endl;

         cout << "11: " << s_int.pop()    // генерация исключения //- стек пуст

                 << endl;

     }                      // end try

catch (Stack:: Range1)                 // обработчик исключений

{ cout << "Исключение: нарушение границы стека сверху" << endl;   }

catch (Stack:: Range2)         // обработчик исключений

{ cout << "Исключение: нарушение границы стека снизу" << endl;     }

cout << "Завершение работы программы" << endl;

return 0;

}

 

Контрольные вопросы

1. Какую цель преследует использование в программе обработки исключений?

2. Как оформляется блок обработки исключений?

3. Что такое обработчики исключений?

Варианты заданий

Номер варианта Задание
1, 13 Опишите функцию умножения двух целых, обработайте ошибку переполнения сверху (overflow).
2, 14 Опишите функцию деления двух целых, обработайте ошибку переполнения снизу (underflow).
3, 15 Опишите функцию вычисления логарифма, обработайте ошибку вычисления логарифма 0
4, 16 Переопределите оператор ++ для указателя на массив целых, обработайте ошибку выхода за границы массива.
5, 17 Опишите функцию анализа номера телефона, обработайте ошибку задания номера в неверном формате (допустимый формат - +7(495)555-44-33).
6, 18 Опишите оператор [] для вектора элементов, обработайте ошибку выхода за границы массива.
7, 19 Опишите функцию анализа времени, обработайте ошибку задания даты в неверном формате (допустимый формат – дд-мм-гггг) и ошибку корректности вводимых данных.
8, 20 Опишите функцию умножения двух чисел с плавающей запятой, обработайте ошибку переполнения сверху (overflow).
9, 21 Опишите функцию вычисления логарифма, обработайте ошибку вычисления логарифма отрицательного числа
10, 22 Опишите функцию деления двух чисел с плавающей запятой, обработайте ошибку деления на ноль (zero division).
11, 23 Опишите функцию вычисления квадратного корня, обработайте ошибку вычисления корня из отрицательного числа.
12, 24 Опишите функцию анализа времени, обработайте ошибку задания времени в неверном формате (допустимый формат – чч:мм:сс) и ошибку корректности вводимых данных.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.