Try-catch-throw

Автор работы: Пользователь скрыл имя, 23 Декабря 2011 в 23:23, реферат

Описание

С++ является языком объектно-ориентированного программирования (ООП). Объект - абстрактная сущность, наделенная характеристиками объектов реального мира.
Наследование - наличие в языке ООП механизма, позволяющего объектам класса наследовать характеристики более простых и общих типов. Наследование обеспечивает как требуемый уровень общности, так и необходимую специализацию.
Полиморфизм - дословный перевод с греческого "много форм". В С++ полиморфизм реализуется с помощью виртуальных функций, которые позволяют в рамках всей иерархии классов иметь несколько версий одной и той же функции. Решение о том, какая именно версия должна выполняться в данный момент, определяется на этапе выполнения программы и носит название позднего связывания.

Содержание

1. Теоретическое введение………………………………………………………………….…….…4
2. Код программы…………………………………………………………………………………….6
3. Список использованной литературы……………………………………………………………..9

Работа состоит из  1 файл

Курсовая работа.doc

— 57.50 Кб (Скачать документ)

СОДЕРЖАНИЕ: 

1. Теоретическое введение………………………………………………………………….…….…4

2. Код программы…………………………………………………………………………………….6

3. Список использованной  литературы……………………………………………………………..9

 

ТЕОРЕТИЧЕСКОЕ ВВЕДЕНИЕ: 

       С++ является языком объектно-ориентированного программирования (ООП). Объект - абстрактная сущность, наделенная характеристиками объектов реального мира.

       Наследование - наличие в языке ООП механизма, позволяющего объектам класса наследовать  характеристики более простых и  общих типов. Наследование обеспечивает как требуемый уровень общности, так и необходимую специализацию.

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

       Обработка исключений – это механизм, позволяющий двум независимо разработанным программным компонентам взаимодействовать в аномальной ситуации, называемой исключением. В этой главе мы расскажем, как генерировать, или возбуждать, исключение в том месте программы, где имеет место аномалия. Затем мы покажем, как связать catch-обработчик исключений с множеством инструкций программы, используя try-блок. Потом речь пойдет о спецификации исключений – механизме, с помощью которого можно связать список исключений с объявлением функции, и функция не сможет возбудить никаких других исключений.

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

     Try-catch-throw

     Давайте же разберем основы обработки исключений в С++. Чтобы комфортно работать с исключениями в С++ вам нужно знать лишь три ключевых слова:

  • try (пытаться) - начало блока исключений;
  • catch (поймать) - начало блока, "ловящего" исключение;
  • throw (бросить) - ключевое слово, "создающее" ("возбуждающее") исключение.

     А теперь пример, демонстрирующий, как  применить то, что вы узнали:

void func()

try 

{   

throw 1; 

catch(int a) 

{   

cout << "Caught exception number:  " << a << endl;   

return; 

cout << "No exception detected!" << endl; 

return;

}

     Если  выполнить этот фрагмент кода, то мы получим следующий результат:

Caught exception number:  1

Теперь закоментируйте строку throw 1; и функция выдаст такой  результат:

No exception detected!

     Если это применить с умом, такой подход покажется вам очень мощным средством обработки ошибок. Catch может "ловить" любой тип данных, так же как и throw может "кинуть" данные любого типа. Т.е. throw AnyClass(); будет правильно работать, так же как и catch (AnyClass &d) {};.

     Как уже было сказано, catch может "ловить" данные любого типа, но вовсе не обязательно  при это указывать переменную. Т.е. прекрасно будет работать что-нибудь типа этого:

catch(dumbclass) { }

так же, как и

catch(dumbclass&) { }

Так же можно "поймать" и все исключения:

catch(...) { }

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

try { 

throw 1;

//  throw 'a';

}

catch (long b) { 

cout << "пойман тип long:  " << b << endl;

}

catch (char b) { 

cout << "пойман тип char:  " << b << endl;

}"

     Создание  исключений

     Когда возбуждается исключительная ситуация, программа просматривает стек функций  до тех пор, пока не находит соответствующий catch. Если оператор catch не найден, STL будет обрабатывать исключение в стандартном обработчике, который делает все менее изящно, чем могли бы сделать вы, показывая какие-то непонятные (для конечного пользователя) сообщения и обычно аварийно завершая программу.

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

 

       КОД ПРОГРАММЫ: 

#include <iostream>

#include <math.h>

using namespace std;

class koord

{public:

      double x,y;

      static double dlina(koord a,koord b){

            double q=(b.x-a.x);

            double w=(b.y-a.y);

            return (sqrt(pow(q,2)+pow(w,2)));

      }

};

class mnogoug

{public:

      koord a,b,c,d;

      virtual double square()=0;

      virtual double perimetr()=0;

      class error{public:error(){cout<<"!!!Oshibka vvoda dannih!!!"<<endl;}};

};

class treug:public mnogoug

{public:

      virtual double perimetr()

      {

            double prm;

            prm=koord::dlina(this->a,this->b)+koord::dlina(this->b,this->c)+koord::dlina(this->c,this->a);

            return prm;

      }

      virtual double square()

      {

            double P=(this->perimetr())/2;

            double A=koord::dlina(this->a,this->b);

            double B=koord::dlina(this->b,this->c);

            double C=koord::dlina(this->c,this->a);

            return (sqrt(P*(P-A)*(P-B)*(P-C)));

      }

};

class prtreug:public treug

{public:

      virtual double perimetr()

      {

            double AB=koord::dlina(this->a,this->b);

            double BC=koord::dlina(this->b,this->c);

            double CA=koord::dlina(this->c,this->a);

            if(!((pow(AB,2)!=pow(BC,2)+pow(CA,2))&&(pow(BC,2)!=pow(AB,2)+pow(CA,2))&&(pow(CA,2)!=pow(AB,2)+pow(BC,2)))){throw error();return 0;}

            double prm=AB+BC+CA;

            return prm;

      }

};

class parmm:public mnogoug

{public:

virtual double perimetr()

      {

            double AB=koord::dlina(this->a,this->b);

            double BC=koord::dlina(this->b,this->c);

            double AC=koord::dlina(this->a,this->c);

            double BD=koord::dlina(this->b,this->d);

            if ((pow(AC,2)+pow(BD,2))!=2*(pow(AB,2)+pow(BC,2))){throw error();return 0;}

            return 2*(AB+BC);

      }

virtual double square()

      {

            double AB=koord::dlina(this->a,this->b);

            double AD=koord::dlina(this->a,this->d);

            double AC=koord::dlina(this->a,this->c);

            double BD=koord::dlina(this->b,this->d);

            if ((AC*AC+BD*BD)!=2*(AB*AB+AD*AD)){throw error();return 0;}

            double x1=(b.x-a.x);double y1=(b.y-a.y);

            double x2=(d.x-a.x);double y2=(d.y-a.y);

            double cosABAD=(x1*x2+y2*y1)/sqrt((x1*x1+y1*y1)*(x2*x2+y2*y2));

            double sinABAD=sqrt(1-pow(cosABAD,2));

            return AB*AD*sinABAD;

      }

};

class prug:public parmm

{public:

      virtual double perimetr()

      {

            double AB=koord::dlina(this->a,this->b);

            double BC=koord::dlina(this->b,this->c);

            double AC=koord::dlina(this->a,this->c);

            if((pow(AC,2))!=(pow(AB,2)+pow(BC,2))){throw error();return 0;}

            return (AB+BC)*2;

      }

      virtual double square()

      {

            double AB=koord::dlina(this->a,this->b);

            double BC=koord::dlina(this->b,this->c);

            double AC=koord::dlina(this->a,this->c);

            if((AC*AC)!=(AB*AB+BC*BC)){throw error();return 0;}

            return AB*BC;

      }

};

class kvdr:public prug

{public:

      virtual double perimetr()

      {

            double AB=koord::dlina(this->a,this->b);

            double BC=koord::dlina(this->b,this->c);

            double CD=koord::dlina(this->c,this->d);

            double DA=koord::dlina(this->d,this->a);

            if((AB!=BC)&&(BC!=CD)&&(CD!=DA)){throw error();return 0;}

            return 4*AB;

      }

      virtual double square()

      {

            double AB=koord::dlina(this->a,this->b);

            double BC=koord::dlina(this->b,this->c);

            double CD=koord::dlina(this->c,this->d);

            double DA=koord::dlina(this->d,this->a);

            if((AB!=BC)&&(BC!=CD)&&(CD!=DA)){throw error();return 0;}

            return pow(AB,2);

      }

};

void main(){

int i=-3;

treug raz;

prtreug dva;

parmm tri;

prug chet;

kvdr five;

while(i!=8){

      cout<<"Vibor phiguri"<<endl

            <<"1 Treugolnik"<<endl

            <<"2 Pryamoug treugolnik"<<endl

            <<"3 Parallelogramm"<<endl

            <<"4 Pryamougolnik"<<endl

            <<"5 Kvadrat"<<endl

            <<"8 Vihod"<<endl;

      cin>>i;

switch(i){

case 1:

      cout<<"Vvedite tochki"<<endl;

      cin>>raz.a.x>>raz.a.y>>raz.b.x>>raz.b.y>>raz.c.x>>raz.c.y;

Информация о работе Try-catch-throw