Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

19_исключения_14

.doc
Скачиваний:
14
Добавлен:
10.04.2019
Размер:
58.88 Кб
Скачать

Лабораторная работа № 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. Какую цель преследует использование в программе обработки исключений?

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

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

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

Номер варианта

Задание

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.

171