Ерекше жағдайларды өңдеу түсінігі. Ерекше жағдайлар класы
Әдістемелік нұсқаулар
Ерекше жағдайлар түсінігі қосымшаның орындалуы кезіндегі пайда болатын қателермен байланысты қарастырылады. Программист өзінің құрған қосымшасы орындалған кезде болуы мүмкін қателерді анықтап, ол қателер бола қалған жағдайда программа қалай жұмыс жасауы керек екенін алдын-ала қамтамасыз етуі тиіс. Жалпы программалау кезінде жіберілетін қателерді келесі топтарға бөледі:
Синтаксистік қателер. Синтаксистік қателерге программа мәтінін теру кезінде операторлардың қате жазылуы, операторларды айыру белгілерінің қойылмауы, программа соңының көрсетілмеуі және т.б. жатады.
Логикалық қателер, есеп алгоритмінің дұрыс құрылмауынан болады.
Динамикалық қателер бұл- программаның орындалуы кезінде пайда болып оның орындалу тәртібінің бұзылуына немесе нәтижесіз тоқтап қалуына әкеліп соқтыратын қателер.
Ерекше жағдайлар класы.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-ға арналған қосымшада қарапайым ЕЖ-ды
жалпы өңдеушінің /глобальный обработчик/ көмегімен орындап көру;
дербес өңдеуші көмегімен орындап көру.
Дербес өңдеушінің жұмысын көру үшін жалпы өңдеушіні уақытша тоқтата тұру керек, ол үшін 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
{
// ерекше жағдайлар туса да орындалатын код
}
Өзіндік жұмыс тапсымалары
Келесі мазмұндағы есептерді шешу программаларындағы ерекше жағдайларды анықтап оны екі жолмен өңдеуді /жалпы және дербес өңдеушілер/ қарастырыңыз.
Пирамиданың көлемін табу.
Үш қабырғасы бойынша үшбұрыштың ауданын есептеу.
Параллелипедтің көлемін есептеу.
Тізбектің жалпы кедергісін есептеу (параллель қосылған).
Трапецияның ауданын есептеу.
Тізбектің жалпы кедергісін есептеу (тізбектей қосылған).
Екі қабырғасы және арасындағы бұрышы бойынша үшбұрыштың ауданын есептеу.
Бүтін сандармен арифметикалық амалдарды орындай алатын калькулятор программа жасау.
Тригонометриялық функцияларды және түбір табуды орындай алатын калькулятор жасау.
Цилиндр көлемін табу.
</endl;
9 - зертханалық жұмыс.