Исключения. Как не допустить логических ошибок при выполнении программы (C++)

Содержание

Слайд 2

Как не допустить логических ошибок при выполнении программы?

Как не допустить логических ошибок при выполнении программы?

Слайд 3

Некорректное создание объектов классов(1) class Table{ int *l,*w,*h; char* color; bool

Некорректное создание объектов классов(1)
class Table{
int *l,*w,*h;
char* color;
bool Init(int

l1,int w1, int h1,char* col);
public:
Table(int len, int wid, int hei ,char* col, bool& err);
void Print();
~Table();
};
Слайд 4

Некорректное создание объектов классов(2) bool Table::Init(int l1,int w1, int h1,char* col)

Некорректное создание объектов классов(2)

bool Table::Init(int l1,int w1, int h1,char* col)
{ cout<<"bool

Table::Init(int l1,int w1, int h1,char* col)\n";
if( (l1>0) && (h1>0) && (w1>0) )
{
*l=l1;*h=h1;*w=w1;
strcpy(color,col);
return true;
}
else{
cout<<"\tError, incorreect data init\n";
return false; } }
Слайд 5

Некорректное создание объектов классов(3) Table::Table (int len,int wid, int hei,char* col,bool&

Некорректное создание объектов классов(3)

Table::Table (int len,int wid, int hei,char* col,bool& err)
{
cout<<"Table::Table(int

len,int wid, int hei,char col,bool& err)\n";
h=new int; l=new int; w=new int;
color=new char[20];
err=Init(len, wid, hei, col);
if(!err)
{
delete this;
}
else cout<<"Create Table\n";
}
Слайд 6

Некорректное создание объектов классов(4) void Table::Print() { cout cout cout cout

Некорректное создание объектов классов(4)

void Table::Print()
{ cout<<"void Table::Print()\n";
cout<<"\tTable information:\n";
cout<<"\t\t h

= "<<*h<<"\n";
cout<<"\t\t w = "<<*w<<"\n";
cout<<"\t\t l = "<<*l<<"\n";
cout<<"\t\t color: "<}
Table::~Table()
{
cout<<"Table::~Table()\n";
delete h; delete l; delete w; delete[]color;
}
Слайд 7

Некорректное создание объектов классов(5) int main() { bool err=false; Table *

Некорректное создание объектов классов(5)

int main()
{
bool err=false;
Table * T= new

Table(-10,10,10,"black",err);
if(!err) { T=NULL; return -1; }
T->Print();
delete T;
return 0;
}
Слайд 8

Механизм исключений throw для обозначения кода ошибки try для начала блока,

Механизм исключений

throw
для обозначения кода ошибки
try
для начала блока, в котором

может возникнуть «аварийная» ситуация
catch
для обработки кода ошибки, выкидываемой throw.
Слайд 9

Что такое исключение Исключение – это объект, а не ситуация. С

Что такое исключение
Исключение – это объект, а не ситуация.
С исключением можно

работать как с переменной.
Тип объекта исключения может быть любым.
Слайд 10

Определение исключения Синтаксис: throw выражение_генерации_исключения; Примеры: throw “Ошибка: деление на ноль”; throw 1; throw s[i];

Определение исключения

Синтаксис:
throw выражение_генерации_исключения;
Примеры:
throw “Ошибка: деление на ноль”;
throw 1;
throw s[i];


Слайд 11

Объект - исключение throw MyException(1,”Error 1”); // оператор-ловушка - catch(MyException m)

Объект - исключение

throw MyException(1,”Error 1”);
// оператор-ловушка - catch(MyException m)
throw new

MyException(1,”Error 1”);
// оператор-ловушка - catch(MyException *m)
Слайд 12

Перехват исключения Синтаксис: try { /* контролируемый блок */ } catch

Перехват исключения

Синтаксис:
try {
/* контролируемый блок */
}
catch (спецификация исключения № 1)


{ /* блок обработки 1*/ }
catch (спецификация исключения № 2)
{ /* блок обработки 2*/ }

catch (спецификация исключения № n)
{ /* блок обработки n*/ }
Слайд 13

Спецификация исключения (тип имя) Если необходимо объект – исключение использовать в

Спецификация исключения

(тип имя)
Если необходимо объект – исключение использовать в блоке

обработки
(тип)
Если в блоке обработки объект-исключение не используется
(…)
Такой обработчик перехватывает все исключительные ситуации.
Слайд 14

Правила работы с try Если сработал хоть один блок обработки исключений, то последующие не выполнятся.

Правила работы с try

Если сработал хоть один блок обработки исключений, то

последующие не выполнятся.
Слайд 15

Правила работы с try Если сработал хоть один блок обработки исключений,

Правила работы с try

Если сработал хоть один блок обработки исключений, то

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

Правила работы с try Если сработал хоть один блок обработки исключений,

Правила работы с try

Если сработал хоть один блок обработки исключений, то

последующие не выполнятся.
Последним обработчиком должен быть самый общий вариант, для обработки всех исключений.
Если в блоке try не выпало исключительной ситуации, то все блоки catch пропускаются и выполняются те действия, которые дальше идут по коду.
Слайд 17

Правила работы с try Если сработал хоть один блок обработки исключений,

Правила работы с try

Если сработал хоть один блок обработки исключений, то

последующие не выполнятся.
Последним обработчиком должен быть самый общий вариант, для обработки всех исключений.
Если в блоке try не выпало исключительной ситуации, то все блоки catch пропускаются и выполняются те действия, которые дальше идут по коду.
Блоки try и catch могут быть вложенными.
Слайд 18

Пример: класс MyEx (1) class MyEx{ public: int code; char* message;

Пример: класс MyEx (1)

class MyEx{
public:
int code;
char* message;
MyEx(int a,

char* b);
~MyEx();
};
Слайд 19

Пример : класс MyEx (2) MyEx::MyEx (int a, char* b) {

Пример : класс MyEx (2)

MyEx::MyEx (int a, char* b)
{
cout<<"MyEx::MyEx(int a,char*

b)\n";
code=a;
message=new char [ strlen(b) + 1 ];
strcpy ( message, b );
}
Слайд 20

Пример : класс MyEx (3) MyEx::~MyEx() { cout delete[] message; }

Пример : класс MyEx (3)

MyEx::~MyEx()
{
cout<<"MyEx::~MyEx()\n";
delete[] message;
}

Слайд 21

Пример : генерация исключений(1) void Table::Init (int len ,int wid, int

Пример : генерация исключений(1)

void Table::Init (int len ,int wid, int hei,

char* col)
{
*l=len; *w=wid; *h=hei; strcpy(color,col);
}
Слайд 22

Пример : генерация исключений(2) Table::Table (int len, int wid, int hei,

Пример : генерация исключений(2)

Table::Table (int len, int wid, int hei, char

*col)
{
if(len>0&&wid>0&&hei>0)
{ h=new int; l=new int; w=new int;
color=new char[20]; Init(len,wid,hei,col);
}
else {
throw(MyEx(1,"some parameters are not positive"));
} }
Слайд 23

Пример : генерация исключений(3) int main() { try { Table* T=new

Пример : генерация исключений(3)

int main()
{
try
{
Table* T=new Table(-1,5,6, “green”);
T->Print();

delete T;
}
catch(MyEx e)
{
cout< }
Слайд 24

Пример : генерация исключений(3) catch(...) { cout } return 0; }

Пример : генерация исключений(3)

catch(...)
{
cout<<"I catch everything"< }
return 0;
}