Ерекше жадайларды деу тсінігі. Ерекше жадайлар класы


дістемелік нсаулар


Ерекше жадайлар тсінігі осымшаны орындалуы кезіндегі пайда болатын ателермен байланысты арастырылады. Программист зіні ран осымшасы орындалан кезде болуы ммкін ателерді анытап, ол ателер бола алан жадайда программа алай жмыс жасауы керек екенін алдын-ала амтамасыз етуі тиіс. Жалпы программалау кезінде жіберілетін ателерді келесі топтара бледі:


  • Синтаксистік ателер. Синтаксистік ателерге программа мтінін теру кезінде операторларды ате жазылуы, операторларды айыру белгілеріні ойылмауы, программа соыны крсетілмеуі жне т.б. жатады.

  • Логикалы ателер, есеп алгоритміні дрыс рылмауынан болады.

  • Динамикалы ателер бл- программаны орындалуы кезінде пайда болып оны орындалу тртібіні бзылуына немесе нтижесіз тотап алуына келіп сотыратын ателер.


Ерекше жадайлар класы.C++ Builder ортасындаы ерекше жадайларды барлыы жеке объектілер ретінде арастырылады жне бл объектілер шін базалы класс TObject-ден тарайтын TException класы болады, программада бл классты сипаттамасы SysUtils стандарт модулінде беріледі.

асиеттері. TException класынан тарайтын жоарыда аталан тума кластар шін аныталан асиеттер:

Message асиеті (типі AnsiString) ерекше жадайды немесе атені сипаттамасын схбат терезіне шыару шін олданылады.

__property AnsiString Message = {read=FMessage, write=FMessage};

HelpContext асиеті ( типі THelpContext) анытама жйесіндегі объект трінде аныталан атеге сйкес блімні номерін немесе идентификатор номерін крсету шін олданылады.

__property int HelpContext = {read

=FHelpContext, write=FHelpContext, nodefault};

Ерекше жадайларды деу.осымшаларда ерекше жадайларды деу екі трлі жолмен жзеге асырылады: ерекше жадайларды жалпы деуші /глобальный обработчик/ жне дербес деуші /локальный обработчик/. осымшадаы ерекше жадайларды жалпы деушіні жмысын амтамасыз ету Application объектісіні ызметіне жатады, Application объектісі жйе тарапынан ерекше жадайды пайда боланы жнінде хабар алысымен TExceptionEvent типіне жататын OnException оиасын генерациялайды да, осы пайда болан оианы деушісі, осымшадаы ерекше жадайларды жалпы деушіні ызметін атарады. детте осымшалардаы ерекше жадайларды жалпы деуші бл- Application объектісіні дісі болып есептелетін HandleException(System::TObject* Sender); функциясы. Бл функция арылы шаырылатын осымшаны ShowException(System::TObject* ExceptObject, void * ExceptAddr); дісі, пайда болан ерекше жадайды сипаттамасын экрана, схбат терезесіне шыарады, мысалы осымшаны орындалуы кезінде «нольге блу немесе блшекті блімі нольге те» болан ерекше жадайларда жалпы деуші бл жнінде олданушыа хабарлайды /4.13- сурет/.


4.13-сурет. Ерекше жадайды жалпы

деуші ызметіні мысалы


Программада дербес деушіні олдануды жолдары:


  • try ... catchблогында ерекше жадайды деу;

  • try ... __finallyблогын пайдаланып кодты «мусордан» тазалау.


try ... сatch операторы.Ерекше жадайларды деуде программистті дербес деушілерді олдануы шін try ... сatch операторы пайдаланылады.

Жалпы жазылуы:

Try

{ // «оралан блокты» басы

throw 1-рнек;

/ / бл оператор ерекше жадайды оны деушіге латырады.

throw 2-рнек;

...

throw n-рнек;

} // «оралан блокты» соы

catch(1-рнекті типіне сйкес айнымалыны типі)

{

1-рнекке сйкес ЕЖ деушіні коды

}

catch(2-рнекті типіне сйкес айнымалыны типі)

{

2-рнекке сйкес ЕЖ деушіні коды

}


catch(n-рнекті типіне сйкес айнымалыны типі)

{

n-рнекке сйкес ЕЖ деушіні коды

}


мндаы, try («орындап кру, байап кру» - деген маынаны білдіреді) сзімен басталып, {…} фигуралы жашаа алынан программа мтініні фрагменттерін оралан блоктар немесе уаытша блоктар деп атайды, яни ерекше жадай туызуы ммкін программа коды осы оралан блокта орналасуы керек.

деуші кодcatchызметші сзінен басталады.Содан кейін жай жашаны ішінде ЕЖ типі крсетіледі, егер жай жашаны ішінде кп нкте /... / трса онда ол ол кез-келген ЕЖ дей алады, мысалы:

catch(int i)

{ // int типті ЕЖ деуші код

}

catch(char* str)

{ // char*типті ЕЖ деуші код

}

catch (...)

{ //кез-келген типті ЕЖ деуші код

}


Жаттыу жмыстары


1-жаттыу.Консолды осымшада арапайым ЕЖ деуді орындап кру.

#include

#include

#include

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int main()

{

double d = 1.0;

for (int i=0; i<4; i++)

{

Try

{

cout << endl<< "try-block bastaldi..." <<endl;

switch (i)

{

case 0:

throw " goldi laktiru "; // char* типті жолды латыру

case 1:

throw 5; // int.-бтінді латыру.

default:

throw d; // double –ді латыру.

}

// Келесі оператор ЕЖ байланысты орындалмай

cout<< "Byl try-block-ka bailanisti orindalmaidi" << endl;

} // try-блокты соы

catch(int i)

{ // int типті ЕЖ деуші код

cout << "Int laktirildi /thrown /: " << 1 << endl;

}

catch(char* str)

{ //char* типті ЕЖ деуші код

cout << "string-gol laktirildi: " << str << endl;

}

catch (...) { //Кез-келген ЕЖ деуші код

cout << "kalgan type laktirildi."<< "Program will.terminate." << endl;

cin.ignore () ;

return -1; // Программадан шыу

}

cout<< "sikldin soni"<< endl;

} // циклды соы.

cout << "progr soni" << endl; // Бл операторлар орындалмайды

себебі, шінші catch (...) //программаны аятап тастайды

return 0;

}

Бл мысалда цикл трт рет орындалуы керек. Цикл ішінде і- цикл параметріні мндеріне сйкес int, char* жне doubleтипті ЕЖ шаыратын оралан блок орналасан. і=0 боланда throw операторы char*типтіжолды латырады, ал оны char* типті екінші тран деуші стап алады да, соан сйкес жазуды шыарады, себебі кодта содан баса ештее жазылмаан, тура сол сияты і=1 боланда оралан блоктаы throw операторы int типті ЕЖ латырады, оны бірінші тран catch(int i) дейді. і=2 боланда double типті ЕЖ пайда болады, ал оан сйкес catchарастырылмаан, біра оны кез-келген жадай шін орындалатын шіншіcatch (...) стайды жне ондаы кодтаы cin.ignore () жне return -1; командалары программадан шыуды немесе аятауды орындайды, яни цикл тртінші рет і=3 шін орындалып лгермейді.

Программаны нтижесі:


2-жаттыу.Windows-а арналан осымшада арапайым ЕЖ-ды


  1. жалпы деушіні /глобальный обработчик/ кмегімен орындап кру;

  2. дербес деуші кмегімен орындап кру.


Дербес деушіні жмысын кру шін жалпы деушіні уаытша тотата тру керек, ол шін Tools -> Debugger Options командаларын орындап, пайда болан терезеде Language Exceptions жапсырмасыны Stop on Delphi Exceptions жне Stop On C++ Exceptions немесе Integrated debugging опцияларындаы флажокты алу керек /4.14(А,Б,С)-4.15(А,Б,С) суреттер/ .


Программа мтіні:

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

void __fastcall TForm1::Button1Click(TObject *Sender)

{

float a,b,c;

float d,x1,x2;

a=StrToInt(Edit1->Text);

b=StrToInt(Edit2->Text);

c=StrToInt(Edit3->Text);

Try

{ d=b/a;

x1=log(c);

x2= d;

Edit4->Text=FloatToStrF(x1,ffGeneral,5,2);

Edit5->Text=FloatToStrF(x2,ffGeneral,5,2);

}

catch(...)

{ MessageDlg("try-блокта кате бар",mtError, TMsgDlgButtons()

<< mbOK, 0);

//return;

}

Edit6->Text="Мен орындалдым";

Программа орындалуыны нетижелері:

1) ЕЖ –ды жалпы деуші / глобальный обработчик/ стады.


4.14-сурет. а)Ерекше жадайларды жалпы деуші

/глобальный обработчик/ стады.

4.14-сурет. б)Ерекше жадайларды жалпы деуші

/глобальный обработчик/ стады.

4.14-сурет. с)Ерекше жадайларды жалпы деуші

/глобальный обработчик/ стады.


2) ЕЖ –ды дербес деуші /локальный обработчик/ стады.


4.15-сурет. а) Ерекше жадайларды дербес деуші /локальный

обработчик/ стады жне оны олданушыны коды деді.

4.15-сурет. б) Ерекше жадайларды дербес деуші /локальный

обработчик/ стады жне оны олданушыны коды деді.


4.15-сурет. с) Ерекше жадайларды дербес деуші /локальный

обработчик/ стады жне оны олданушыны коды деді.


try…__ finally операторыны (немесе оралан блогыны) программадаы жазылуы:

Try

{

//оралан блок

}

__ finally

{

// ерекше жадайлар туса да орындалатын код

}


зіндік жмыс тапсымалары


Келесі мазмндаы есептерді шешу программаларындаы ерекше жадайларды анытап оны екі жолмен деуді /жалпы жне дербес деушілер/ арастырыыз.


  1. Пирамиданы клемін табу.

  2. ш абырасы бойынша шбрышты ауданын есептеу.

  3. Параллелипедті клемін есептеу.

  4. Тізбекті жалпы кедергісін есептеу (параллель осылан).

  5. Трапецияны ауданын есептеу.

  6. Тізбекті жалпы кедергісін есептеу (тізбектей осылан).

  7. Екі абырасы жне арасындаы брышы бойынша шбрышты ауданын есептеу.

  8. Бтін сандармен арифметикалы амалдарды орындай алатын калькулятор программа жасау.

  9. Тригонометриялы функцияларды жне тбір табуды орындай алатын калькулятор жасау.

  10. Цилиндр клемін табу.

</endl;
9 - зертханалы жмыс.