• Название:

    3 исключения

  • Размер: 0.06 Мб
  • Формат: DOC
  • или



БДЗ № 3
Исключения в С++
Цель работы:

1) изучить различные способы обработки исключений;

2) получить практические навыки программирования задач с обработкой исключений.
Теоретические сведения
Механизм обработки исключительных ситуаций в С++ предназначен для отслеживания ошибочных вычислительных ситуаций и безопасной реакции программы на них.
Традиционно к исключительным ситуациям относятся, например, деление на ноль, вычисление логарифма отрицательного числа, выход за границы массива и т. д.
Однако, допустимо использование этого механизма для отслеживания любой вычислительной ситуации.
Синтаксически обработка исключений реализуется с помощью ключевых слов try, catch и throw:
try { /* блок try, где должен находиться оператор, генерирующий исключения */
}
catch (type1 arg1) { /* блок catch перехвата и обработки исключения типа type1 */
}
catch (type2 arg2) { /* блок catch перехвата и обработки исключения типа type2 */
}

catch (type N arg N) { /* блок catch перехвата и обработки исключения типа type N */
}
Оператор throw должен выполняться либо внутри блока try, либо в любой функции, которую этот блок вызывает:
throw исключительная_ситуация;

Пример 3.1
#include
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
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, 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
Опишите функцию анализа времени, обработайте ошибку задания времени в неверном формате (допустимый формат – чч:мм:сс) и ошибку корректности вводимых данных.

HYPER13 PAGE HYPER15 139