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


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

Func1(true);
}
catch (Xato1 & xato)
{
puts("Xato1 turidagi istisno qayta ishlandi!");
test=true;
}
}
int main()
{
try
{
test=false;
Func2();
test?
puts("Func2() funksiyasi istisnoni qayta ishladi"):
puts("Hech qanday istisno holat ro'y bermadi");
}
catch(...)
{
puts("Func2() funksiyasi istisnoni yuzaga keltirdi!");
}
return 0;
}
Ушбу мисол истисно таснифи истисно ҳолатни функциядан ташқарига чиқишга йўл қўймаслигини кўрсатади. Шу сабабли, бош функциядаги catch(…) блоки ҳеч қачон ишламайди. Функция ичида юзага келадиган истиснони функция ичида қайта ишлашни мумкин. Агар Func1() функцияси Xato1 туридан фарқли истиснони юзага келтирса, у кутилмаган истисно бўлади.


Истисноларни илиб олиш
Программанинг бирорта нуқтасида истисно юзага келса, программа бажарилиши узилади ва қуйидагилар рўй беради:

  • агар асос турдаги ўзгарувчи ёки қиймат бўйича синф объекти пайдо қилинган бўлса, ўзгарувчисининг нусхаси яратилади (объект учун нусхалаш конструктори ишлатилади); агар мурожаат бўйича ўзгарувчи пайдо қилинган бўлса, нусхалаш рўй бермайди;

  • пайдо қилинган ўзгарувчи билан мос келувчи параметрни қабул қила оладиган энг яқин қайта ишлаш блоки изланади;

  • агар қайта ишлаш блоки топилган бўлса, стек шу нуқтагача «бўшатилади», бунда кўриниш соҳасидан чиққан локал объектлар деструкторлари чақирилади;

  • бошқарув топилган қайта ишлаш блокига узатилади;

  • агар истиснони қайта ишлайдиган блок топилмаса, программа тузувчи программани тугатиш қайта ишловчиси - set_terminate() функциясини чақириш орқали программани тугатиши мумкин, акс ҳолда программанинг ўзи тугатиш функциясини чақиради.

Истиснога мос қайта ишлаш блокини излашда компилятор қуйидаги қоидаларга риоя қилади. Истиснога қайта ишловчи мос ҳисобланади:

  • пайдо қилинган ўзгарувчи тури қайта ишловчи кутаётган тур бўлса. Бошқача айтганда, агар пайдо бўлган ўзгарувчи тури T бўлса, параметрлари T, const T, T& ва const T& турида бўлса;

  • пайдо бўлган ўзгарувчи кўрсаткич бўлиб, унинг турини қайта ишловчининг турига келтириш мумкин бўлса;

  • пайдо бўлган ўзгарувчи қандайдир ворис синф объекти бўлиб, қайта ишловчи тури унга нисбатан таянч синф турида ва ворислик public мурожаат хоссаси бўйича ҳосил қилинган бўлса.

Шуни қайд қилиш керакки, компилятор пайдо бўлган ўзгарувчи тури билан мос келувчи параметрни қабул қиладиган энг яқин қайта ишловчини қидиради. Шу сабабли, мазкур try-блок учун аниқланган catch-блоклар кетма-кетлигига эътибор бериш зарур бўлади. Таянч синф истисносини кутаётган қайта ишловчи ворис синф қайта ишловчиларини беркитади. Худди шундай void * туридаги кўрсаткич учун аниқланган қайта ишловчи ихтиёрий турдаги кўрсаткич туридаги қайта ишловчи-ларини яширади.
Мисол кўрайлик.

Download 0.58 Mb.

Do'stlaringiz bilan baham:
1   ...   61   62   63   64   65   66   67   68   ...   71




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