|
||||||||||||||||||||||||||||
Теоретические сведения. Пример 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. Что такое обработчики исключений? Варианты заданий
|
||||||||||||||||||||||||||||
|