6.  Обработка исключительных ситуаций в C++

 

C++ обеспечивает встроенный механизм обработки ошибок, называемый обработкой исключительных ситуаций. Он позволяет обрабатывать только синхронные исключительные ситуации, т.е. те ситуации, возникновение которых в явном виде предусмотрено в программе. Асинхронные исключения (ошибки оборудования, аппаратные прерывания) им не обрабатываются.

Для обработки исключительных ситуаций введены три ключевых слова:

try, catch, throw. Эти ключевые слова используются для предупреждения аварийного выхода из программы и корректной очистки памяти.

try служит для обозначения секции кода, которая может генерировать исключения, т.е. нескольких “подозрительных” операторов, в которых возможно возникновение исключительной ситуации (например, деление на ноль, переполнение и т.д.).

Операторы, включенные в фигурные скобки за ключевым словом try, принадлежат к try-блоку. Все функции прямо или косвенно вызываемые из try-блока также принадлежат к нему.

main()

{ …

try{

f1();

f2(); }

… }

f1 и f2 могут в свою очередь вызывать другие функции. Эти функции также принадлежат к try-блоку (они также могут генерировать исключения).

Инструкции catch должны следовать непосредственно за try-блоком. Они представляют собой секцию кода, на которую передается управление в случае возникновения исключения. Их может быть много.

catch (int i) //перехват ошибки

{ cout<<”перехвачена ошибка номер: ”;

cout<<i<<“\n”;

}

catch-обработчик будет срабатывать при выбросе исключения целого типа.

Последним пишется обработчик с тремя точками:

catch (…)

{ …

}

Из описанных в программе обработчиков всегда срабатывает только один.

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

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

Место, где написано слово throw, называется точкой выброса.

Ключевое слово throw без операнда применяется, когда заново выбрасывается то исключение, которое в данный момент обрабатывается. Этот вариант используется либо в catch-обработчике, либо в функции им вызываемом.


void f1()

{ …

if (<условие>)

throw “ошибка”;

}

 

void f2()

{ …

if (<условие>)

{ x=3;

throw x;}

}

Когда выполняется throw

1)  создается копия выброшенного объекта;

2)  “разматывается” стек, вызывая деструкторы локальных объектов, выходящих из области действия;

3)  передается управление ближайшему catch-обработчику, имеющему тип, совпадающий с типом выброшенного объекта. Копия объекта передается обработчику в качестве параметра.

Рассмотрим пример программы, которая иллюстрирует работу с графическими объектами. Здесь реализованы основные принципы объектно-ориентированного программирования на языке C++.

#include <graphics.h> // директива препроцессора для работы с графикой

#include <iostream.h> //директива препроцессора для ввода-вывода

#include <conio.h> //директива препроцессора для ввода одиночного символа

enum Boolean{false, true}; //логический тип

class Location

{protected:

int X;int Y; //защищенные поля класса

public: // открытый блок

// Location (); //Такие конструкторы без параметров создаются компилятором. Его

//объявлять не надо.

Location (int nx, int ny) { X=nx;Y=ny;} // Если функцию определили сразу в классе, то

// это встроенная функция. Она вызывается не

//через стек, а подстановкой в программу.

int GetX() {return X;}

int GetY() { return Y;}

};

// класс Точка

class Point: public Location

{protected:

Boolean vis;

public:

Point (int nx,int ny); //конструктор

//виртуальные функции

virtual void Show(); //функция, реализующая отображение объекта на экране

virtual void Hide(); //функция, позволяющая скрыть объект

virtual void Drag(int by);// движение объекта по экрану в зависимости от шага by

Boolean Isvis() { return vis;}

void MoveTo (int nx ,int ny); // перенос точки из одного места на экране в другое

};

//класс Окружность

class Circle : public Point

{protected:

int R;

public:

Circle (int nx,int ny, int nr); //конструктор

void Show(); // Так как класс Circle является наследником класса Point, функции

void Hide(); // Show() и Hide() также являются виртуальными

void Expand(int by); // увеличение окружности

void Contract(int by);// уменьшение окружности

};

Boolean GetDelta (int &dx,int &dy); //функция определяет какую кнопку нажал

//пользователь

Point::Point(int nx,int ny):Location(nx,ny)

{vis=false; }

void Point:: Show()

{vis= true;putpixel(X,Y,getcolor());}// getcolor() возвращает цвет, который сейчас

// установлен

void Point :: Hide()

{vis=false;putpixel(X,Y,getbkcolor());}//getbkcolor()возвращает цвет фона

void Point :: MoveTo(int nx,int ny)

{Hide();X=nx;Y=ny;Show(); }// точка гасится на старом месте и воспроизводится

// на новом

Boolean GetDelta(int& dx,int& dy)

{char Keych;

Boolean Quit;

dx=0;dy=0;

do

{Keych=getch();

if (Keych == 13)

return (false);

if (Keych == 0)

{Quit=true;

Keych=getch();

switch (Keych){

case 72:dy=-1;break;

case 80: dy=1; break;

case 75:dx=-1; break ;

case 77: dx=1; break ;

default : Quit=false;}; };

} while (!Quit);

return (true); }

// движение объекта по экрану в зависимости от шага by

// Можно нажимать две кнопки одновременно, точка

// будет перемещаться сразу по x и по y под углом 45 градусов

void Point::Drag(int by)

{ int dlx,dly;

int fx,fy;

Show();

fx= GetX();fy= GetY();

while (GetDelta(dlx,dly))

{ fx+=dlx*by;

fy+=dly*by;

MoveTo(fx,fy);};}//перемещение точки, пока стрелка нажата

Circle::Circle(int nx,int ny,int nr):Point(nx,ny)

{ R=nr;}

void Circle:: Show()

{vis=true;circle(X,Y,R); }

void Circle :: Hide()

{unsigned tcol; // tcol - текущее значение цвета

tcol=getcolor();

setcolor(getbkcolor());// установка цвета фона

vis=false;

circle(X,Y,R); //стандартная функция рисования окружности

setcolor(tcol); }//гашение окружности, восстановление исходных значений цвета

void Circle :: Expand(int by) // увеличение окружности

{Hide();

R+=by;

if (R<0)

R=0;

Show(); }

void Circle :: Contract(int by) // уменьшение окружности

{Expand(-by);}

// класс Кольцо

class Ring: public Circle

{protected:

int R; int R1;

public:

Ring(int nx,int ny, int nr, int nr1); //конструктор

void Show();

void Hide();

void Expand(int by);

void Contract(int by);

};

Ring::Ring(int nx,int ny, int nr, int nr1):Circle(nx,ny,nr)

{R=nr;R1=nr1;}

void Ring::Show()

{vis=true;circle(X,Y,R);circle(X,Y,R1);}

void Ring::Hide()

{unsigned tcol;

tcol=getcolor();

setcolor(getbkcolor());

vis=false;

circle(X,Y,R);

circle(X,Y,R1);

setcolor(tcol);

}

void Ring:: Expand(int by)

{Hide();

R+=by;

R1+=by;

if (R<0)

R=0;

if (R1<0)

R1=0;

Show();

}

void Ring:: Contract(int by)

{Expand(-by);}

//класс Ауди

class Audi : public Ring

{protected:

int R;int R1;

public:

Audi(int nx,int ny, int nr, int nr1);

void Show();

void Hide();

void Expand(int by);

void Contract(int by);

};

Audi::Audi(int nx,int ny, int nr, int nr1):Ring(nx,ny,nr,nr1)

{R=nr;R1=nr1;}

void Audi::Show()

{vis=true;

circle(X,Y,R);circle(X,Y,R1); //рисование взаимосвязанных колец

circle(X+120,Y,R);circle(X+120,Y,R1);

circle(X+240,Y,R);circle(X+240,Y,R1);

circle(X+360,Y,R);circle(X+360,Y,R1);

}

void Audi::Hide()

{unsigned tcol;

tcol=getcolor();

setcolor(getbkcolor());

vis=false;

circle(X,Y,R);circle(X,Y,R1);

circle(X+120,Y,R);circle(X+120,Y,R1);

circle(X+240,Y,R);circle(X+240,Y,R1);

circle(X+360,Y,R);circle(X+360,Y,R1);

setcolor(tcol);

}

void Audi:: Expand(int by)

{Hide();

R+=by;

R1+=by;

if (R<0)

R=0;

if (R1<0)

R1=0;

Show();

}

void Audi:: Contract(int by)

{Expand(-by);}

//основная часть программы

void main()

//инициализация графического режима

{ int graphdriver=DETECT,graphmode;

initgraph(&graphdriver,&graphmode,"c:\\borlandc\\bgi");

// создание объекта класса Точка и действия с ним

Point P(100,50);

P.Show(); getch();

P.MoveTo(300,100); getch();

P.Hide();

// создание объекта класса Окружность и действия с ним

Circle C(200,200,100);

C.Show(); getch();

C.MoveTo(300,200); getch();

C.Contract(50);getch();

C.Expand(50);getch();

C.Drag(5);

C.Hide();


// создание объекта класса Кольцо и действия с ним

Ring R(300,300,100,80);

R.Show();getch();

R.MoveTo(200,200); getch();

R.Contract(50);getch();

R.Expand(50);getch();

R.Drag(10);

R.Hide();

// создание объекта класса Ауди и действия с ним

Audi A(100,300,80,70);

A.Show();getch();

A.MoveTo(150,200); getch();

A.Contract(50);getch();

A.Expand(50);getch();

A.Drag(10);

A.Hide();

//закрытие графического режима

closegraph();

}


Информация о работе «Методы программирования в C++»
Раздел: Информатика, программирование
Количество знаков с пробелами: 20279
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
40710
0
0

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

Скачать
8258
0
0

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

Скачать
71422
1
0

... программирование [application programming] — разработка и отладка программ для конечных пользователей, например бухгалтерских, обработки текстов и т. п.   Системное программирование [system programming] — разработка средств общего программного обеспечения, в том числе операционных систем, вспомогательных программ, пакетов программ общесистемного назначения, например: автоматизированных систем ...

Скачать
130405
7
0

... AVR Studio запомнит расположение окон и использует эти установки при следующем запуске проекта. 3.2. Анализ методики реализации разработки программного обеспечения 3.2.1. Классификация вариантов заданий Цель заданий – практическое освоение методики программирования на ассемблере микроконтроллеров ATMEL семейства AVR, отладка программы на симуляторе AVR Studio и программирование кристалла с помощью ...

0 комментариев


Наверх