Төтенше жағдайдың синтаксисі
Try кілттік сөзі мәнді генерациялайтын бақыланатын блок болып табылатын кодты анықтау үшін қолданылады. Блок фигуралық жақшаға алынып жазылады: try{…} try блогынан шақырылатын тура және ауыспалы барлық функциялар сондай ақ оған бағынышты болып есептеледі. Генерация жағдайы параметрмен немесе параметрсіз қолданылатын throw кілттік сөзінен throw[өрнек] throw сөзінен кейін тұратын өрнектің типі жағдайдың туындалатын типін анықтайды. Ағымдағы блокты орындау жағдайы генерациясы кезінде қатысып тұрған өңдеушіні іздеу және оған бағыт беретін жіберу орындалады. Ереже бойынша жағдай try блогында генерацияланады, ал функцияда тура және ауыспалы болады. Ішкі блокта пайда болатын жағдай әр уақытта тез өңделе бермеуі мүмкін. Бұл жағдайда бақыланған блогтар қолданылады және парметрсіз throw кілттік сөзінің көмегімен жоғары деңгейге дейін беріледі. Өңделетін жағдайдың типі жақшада жазылатын, catch кілттік сөзінен басталады. Олар true блогынан тәуелсіз орналасуы керек. Өңделетін жағдайдың типтерінің қатысуымен бір немесе бірнеше өңдеушілерді жазуға болады. Өңдеушілердің синтаксисі бір параметрмен анықталатын функцияны еске түсіреді – жағдай типі. Жазбаның үш формасы бар.
Catch (тип аты){.../* өңдеуші денесі*/}
catch (тип) {… /* өңдеуші денесі * /}
Catch (..) {… /* өңдеуші денесі*/}
Бірінші форма қандай да бір әрекеттерді орындауға арналған өңдеуші денесінде параметр аты қолданылғанда ауыстырылады – мысалы жағдай информацияны шығарғанда. Екінші форма жағдай туралы ақпаратты қолдануды болжай алмайды, оның типі ғана маңызды роль атқарады. Параметрдің орнына қолданған кезде өңдеуші барлық жағдайда алып жүреді деген мағынаны анықтайды. Өңдеушілер жазылған реті бойынша қарастырылады, ал үш типтегі өңдеуші қалғандарынан кейін орналастырылады. Мысалы:
Catch (int I ){
…// жағдайды өңдеу типі int
}
Catch (const char *) {
…// жағдайды өңдеу типі const char*
}
Catch (Overflow){
…// жағдайды өңдеу классы Overfow
}
Catch (…){
…// Барлық жағдайлардың қызмет етпеуі
}
Жағдайды өңдегеннен кейін бағыт жағдайдың өңдеушісінде табылатын бірінші операторға беріледі. Егер жағдай try блогында генерацияланбаса.
Ерекше жағдайларды ұстап қалу
Throw көмегімен генерацияланғанда функция С++ кітапханасы орындаушысын да келесі әрекеттерді орындайды.
Жағдай өңделмейінше статикалық обьект түрінде тұратын throw параметрі көшірмесінен құрылады;
Сәйкес келетін өңдеушіні іздестіру кезінде локальді образдардың деструкторларын шақыры өтіп, әрекет облыстарынан шығып стекке айналдырады.
Өңдеушілерге осы обьектімен типі бойынша сәйкес келетін параметрге ие обьекті мен бағытты береді.
Стекті айналдыру кезінде барлық өңдеушілер әрбір ішкі блоктан сыртқыға өңдеушіге сәйкес келетін деңгейді таппайынша қарайды.
Өңдеуші ізделінді деп аталады, егер обьект типі throw сөзінен кейін орналасса:
Catch параметріне сілтенген (параметр t, const T& формасында жазылуы мүмкін, мұндағы T – жағдайдың типі
Catch параметрінде көрсетілген туынды болып табылады (егер мұрагерлік public кілттік сөзімен рұқсат етілсе)
Catch параметріндегі көрсеткіштің стандартты өзгерту ережесі бойынша өзгеруі мүмкін көрсеткіш болып табылады. Класстың туынды өндірушілері базаның өндірушілеріне дейін орналастырады, кері жағдайда оларға ешқандай бағыт берілмейді. Void типті көрсеткіштің өндірушісі автоматты түрде басқа типті көрсеткіштерді жасырады, сондықтан оларды нақты типті көрсеткіштердің өндірушілеріне дейін орналастыруға болады.
Мысал қарастырайық:
#include
Class Hello{
// Өзінің құрылуы мен жоюлуында ақпарат бертін класс
Public:
Hello () { cout <<”Hello!”<
~Hello () {cout <<”Bye!”<
}:
Void f1(){
Ifstream ifs(“\\INVALID\\FILE\\NAME”) : // ФАЙЛДЫ АШУ
If (!ifs){
Cout<<”жағдайды генерациялау”<
Throw “файлды ашуда қате”:}
}
Void f2{
Hello H:// локальды обьектіні құрамыз”:}
F1(): Функцияны шақырамыз. Жағдайды генерациялау
}
Int main(){
Try{
Cout<<”try блокка кіреміз”<
F2():
Cout<<”try блоктан шығамыз<
}
Catch (int i){
cout<<”int қайта жөндеуді шақыру жағдайы – “<
return -1;
}
Return 0; Бәрі сәтті аяқталды
}
Программаның нәтижесі:
Try блокка кіру
Hello!
Жағдайды генерациялау
Bye!
Қайта жөндеуді шақыру const char *. Жағдай – Файлды ашуда қате. Назар аударыңыз, жағдай туындағаннан кейін локальды обьектінің деструкторы шақырылған болады я болмаса f1 функциясынан шақырылған бағыт main функциядағы өңдеуге жіберілген болатын. Try – блоктан шығатын хабарлама толық шығарылмайды. Программада файлдармен жұмыс жасайтын топтар қолданылады. Механизм жағдайы қателік сетуациялардан шыққан кездегі обьектілерді жоюға мүмкіндік береді.Сондықтан ресурстың белгілеуі және жіберуі-класс түрінде безендіруге қолайлы,мұнда конструктор ресурсты белгілейді,ал деструктор жібереді.Мұнда мысал ретінде файлдарман жұмыс істейтін классты қарастыуға болады.Класстың конструкторы файлды ашады,ал деструктор жабады.Бұл жағдайда қате шыққан кезде файл жабылады және ондағы ақпаат жойылады деген кепілдік бар.Ескертіліп кететіндей жағдай қолданушының типіне оны қолданғандағы тәрізді стандартты түрде де болуы мүмкін,сондықтан оның типін анықтаудың қәжеті жоқ,мұнда жағдайдың туылған нүктесіне және оның өңделетін нүктесіне танымал болуы үшін глобальды типті таңдаса жеткілікті.
Достарыңызбен бөлісу: |