19_исключения_14
.docЛабораторная работа № 19
Исключения в С++
Механизм обработки исключительных ситуаций в С++ предназначен для отслеживания ошибочных вычислительных ситуаций и безопасной реакции программы на них. Традиционно к исключительным ситуациям относятся, например, деление на ноль, вычисление логарифма отрицательного числа, выход за границы массива и т. д. Однако, допустимо использование этого механизма для отслеживания любой вычислительной ситуации.
Синтаксически обработка исключений реализуется с помощью ключевых слов try, catch и throw:
try { /* блок try, где должен находиться оператор, генерирующий исключения */
}
catch (type1 arg1) { /* блок catch перехвата и обработки исключения типа type1 */
}
catch (type2 arg2) { /* блок catch перехвата и обработки исключения типа type2 */
}
…
catch (typeN argN) { /* блок catch перехвата и обработки исключения типа typeN */
}
Оператор throw должен выполняться либо внутри блока try, либо в любой функции, которую этот блок вызывает:
throw исключительная_ситуация;
Пример 19.1
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <conio.h>
using namespace std;
const int n=10;
int _tmain(int argc, _TCHAR* argv[])
{ setlocale(LC_ALL,"Russian");
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 ) {cerr<<"Out of array";
_getch();
exit(1);}
catch (char ) {cerr<<"Index is negative";
_getch();
exit(2);}
_getch();
return 0;
}
Приведенный пример легко может обойтись без использования синтаксиса обработки исключений.
В общем случае для каждой ситуации следует подбирать наиболее эффективный и надежный метод обработки ошибок. Исключения очень подходят для случаев, когда нет возможности вернуть значение, указывающее на то, что произошла ошибка. Эта ситуация наиболее вероятна в конструкторах или в функциях, не имеющих возвращаемого значения. Другой случай эффективного использования исключений, когда генерация ошибки и ее обработчик находятся далеко друг от друга.
Пример 19.2 Создание стека-массива, использующего исключения для отслеживания его верхней и нижней границы.
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <math.h>
#include <conio.h>
using namespace std;
const int RANG = 10; // максимальный размер стека
class Stack
{ int stk[RANG];
int top; // индекс вершины стека
public:
class Range // класс исключений для класса Stack,
{ // тело класса пусто
};
Stack() { top = -1; } // конструктор
void push(int variable) // функция помещения данных в стек
{ if (top >= RANG - 1) // если стек заполнен,
// генерировать исключение
throw Range();
stk[++top] = variable; // иначе –
// протолкнуть число в стек
}
int pop() // функция извлечения данных из стека
{ if (top < 0) // если стек пуст,
// генерировать исключение
throw Range();
return stk[top--]; // иначе - извлечь число из стека
}
}; // class Stack
int _tmain(int argc, _TCHAR* argv[])
{setlocale(LC_ALL, "Russian"); // подключение русификатора
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:: Range) // обработчик исключений
{ cout <<"Исключение: нарушение границы стека" << endl;
}
cout << "Завершение работы программы" << endl;
_getch();
return 0;
}
Контрольные вопросы
-
Какую цель преследует использование в программе обработки исключений?
-
Как оформляется блок обработки исключений?
-
Что такое обработчики исключений?
Варианты заданий
Номер варианта |
Задание |
1, 16 |
Опишите функцию умножения двух целых, обработайте ошибку переполнения сверху (overflow). |
2, 17 |
Опишите функцию деления двух целых, обработайте ошибку переполнения снизу (underflow). |
3, 18 |
Опишите функцию вычисления логарифма, обработайте ошибку вычисления логарифма 0 |
4, 19 |
Переопределите оператор ++ для указателя на массив целых, обработайте ошибку выхода за границы массива. |
5, 20 |
Опишите функцию анализа номера телефона, обработайте ошибку задания номера в неверном формате (допустимый формат - +7(495)555-44-33) и ошибку корректности вводимых данных. |
6, 21 |
Опишите оператор [] для вектора элементов, обработайте ошибку выхода за границы массива. |
7, 22 |
Опишите функцию вычисления котангенса, обработайте ошибку вычисления арктангенса при аргументе, синус которого равен 0. |
8, 23 |
Опишите функцию анализа времени, обработайте ошибку задания даты в неверном формате (допустимый формат – дд-мм-гггг) и ошибку корректности вводимых данных. |
9, 24 |
Опишите функцию умножения двух чисел с плавающей запятой, обработайте ошибку переполнения сверху (overflow). |
10, 25 |
Опишите функцию вычисления логарифма, обработайте ошибку вычисления логарифма отрицательного числа |
11, 26 |
Опишите функцию деления двух чисел с плавающей запятой, обработайте ошибку деления на ноль (zero division). |
12, 27 |
Опишите функцию вычисления квадратного корня, обработайте ошибку вычисления корня из отрицательного числа. |
13, 28 |
Опишите функцию анализа времени, обработайте ошибку задания времени в неверном формате (допустимый формат – чч:мм:сс) и ошибку корректности вводимых данных. |
14, 29 |
Опишите функцию вычисления тангенса, обработайте ошибку вычисления арктангенса при аргументе, косинус которого равен 0. |
15, 30 |
Опишите функцию вычисления арктангенса, обработайте ошибку вычисления арктангенса при аргументе, равном 1 и -1. |