Объектга йўналтирилган программалаш


Download 0.58 Mb.
bet67/71
Sana08.05.2023
Hajmi0.58 Mb.
#1444224
TuriПрограмма
1   ...   63   64   65   66   67   68   69   70   71
Bog'liq
С ОЙП

class Tayanch {};
class Hosila: public Tayanch{};
void Fun_Hosila_Istisnosi()
{
Hosila hosila;
throw hosila;
}
int main()
{
try
{
//...
try
{
Fun_Hosila_Istisnosi();
}
catch (Hosila &)
{
cout<<"Hosila& istisnosi ilib olindi!\n";
}
//...
Tayanch tayanch;
//...
throw tayanch;
}
catch (Tayanch &)
{
cout<<"Tayanch& istisnosi ilib olindi!\n";
}
return 0;
}
Программа бажарилганда экранга қуйидаги натижалар чиқади:
Hosila& istisnosi ilib olindi!
Tayanch& istisnosi ilib olindi!
Аксарият ҳолларда ичма-ич жойлашган try-catch блоклар ноошкор равишда юзага келади: ҳимояга олинган функциянинг танасида ҳимоя-ланган блоклар бўлганда. Қуйидаги мисолда айнан шундай ҳолат кўрса-тилган:
#include
void Fun_Istisno()
{
//...
throw "Fun_Istisno() funksiysida xato!\n";
}
void Fun_Fun_Istisno()
{
//...
char* XatoSatr="Fun_Fun_Istisno()funksiysida xato!\n";
try
{
throw XatoSatr;
}
catch(char *s)
{
cout<
}
Fun_Istisno();
}
void main()
{
try
{
Fun_Fun_Istisno();
}
catch(char *s)
{
cout<
}
}
Программа экранга қуйидаги сатрларни чоп этади.
Fun_Fun_Istisno()funksiysida xato!
Fun_Istisno() funksiysida xato
main() funksiyasida ilib olindi!"
Ичма-ич try-catch блоклар ишлатишга қандайдир функциянинг кутилмаганда истиснони юзага келтириш мумкинлиги сабаб бўлади. Бундай ҳолатларда истиснони ҳал қилишнинг йўлларидан бири - бош функция танасини тўлалигича ҳимояга олиш ва унинг қайта ишловчиси сифатида catch(…) кўриниши ишлатишдир.


Кутилмаган истиснолар ва тугатишни қайта ишлаш
Программа бажарилишида функция, унинг истисно таснифида кўрсатилмаган истиснони юзага келтирса, кутилмаган истисно юзага келди дейилади. Бу ҳолда unexpected() функцияси чақирилади. Ўз навба-тида у, айни пайтдаги кутилмаган истиснонинг қайта ишловчисини чақиради. Келишув бўйича бу terminate() функцияси ҳисобланади. terminate() функциясини чақирилиши программа бажарилиш жараёнини тугатишга олиб келади.
unexpected() функциясининг қуйидаги синтаксисга эга:
void unexpected();
set_unexpected() функцияси ёрдамида программа тузувчининг ўзи кутилмаган истистноларни қайта ишловчи функцияни аниқлаши мумкин. Бу функциянинг прототипи қуйидаги кўринишга эга:
unexpected_handler
set_unexpected(unexpected_handler ph) throw();
бу ерда unexpected_handler кутилмаган истиснони қайта ишловчи функцияга кўрсаткич:
typedef void(*unexpected_handler)();
set_unexpected() функцияси ph параметри кўрсатиб турган функцияни кутилмаган истиснони янги қайта ишловчиси қилиб ўрнатади ва олдинги қайта ишловчининг адресини қайтаради. Янги қайта ишловчи параметрга эга бўлмаслиги керак ва у ҳеч қандай қиймат қайтармайди. Бу функция уни чақирган кодга бошқарувни қайтармайди ва у қуйидаги йўлларнинг бири билан программани бажариш жараёнини тугатади:

  • кутилмаган истиснони юзага келтирлган функциянинг истиснолар таснифида келтирилган турдаги истиснони юзага келтириш орқали;

  • bad_expection туридаги истиснони юзага келтириш орқали;

  • terminate(), abort() ёки exit(1) функциялардан бирини чаыириш орқали.

Юқорида қайд қилингандек, истисно қайта ишловчиси terminate() функциясини чақиради.
bad_expection истисноси

Download 0.58 Mb.

Do'stlaringiz bilan baham:
1   ...   63   64   65   66   67   68   69   70   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling