50
Ерекше жағдайларды өңдеу есептеу процесін логикалық түрде екі
бөлікке бөлуге мүмкіндік береді: авариялық жағдайды табу және оны өңдеу.
С++ тілінің ерекшеліктерді өңдеу құралдарының
басқа артықшылығы қате
туралы хабарламаны беру үшін оның өңделуінің орнына қайтарылатын мәнді,
параметрлерді немесе глобальды айнымалыларды қолдануды талап етпейді.
Сондықтан функциялар интерфейсі таратылмайды.
Өңдеудің жалпы механизмі және ерекшеліктер синтаксисі.
Ерекше жағдайды өңдеу үш шешу сөз арқылы жүзеге асырылады: try,
catch және throw.
Қате туындай алатын, бағдарламалық кодтың фрагменті, байқап көру
деп аударылатын try-қызметші сөзі алдында жазылған, құрама оператор
болып табылатын, бақыланатын блокқа кіру керек .
Егер
қате try блогында бар болса, онда ол қоздырылынып (throw),
содан кейін ұсталынып (catch) және өңделінеді.
Блок try-дан шақырылатын функцияларда, ерекше жағдайды туғыза
алады. Кез келген ерекше жағдай, catch нұсқасымен ұстап алынуы керек, ал
ол, ерекше жағдайды қоздыратын try блогынан кейін орналасу керек. try
блогымен catch нұсқасының бірнешеуі байланыста бола алады. Онда қандай
catch нұсқасы қолданылатыны ерекше жағдайына байланысты, қалған try
блогының нұсқалары ескерілмейді. Программаны
құратын кластары
типтермен бірге кез келген типтерді қолдануға болады. Негізінен ерекше
жағдайлар ретінде, жиі түрде класс типтері қолданылады.
throw нұсқасының негізгі формасы: throw ерекше_жағдай;
Нұсқа throw try блогының ішінде, немесе осы блок шақыратын (тура
немесе жанама) кез келген функцияның ішінде орындалуы керек. Мұндағы
ерекше жағдай – бұл throw ерекше жағдайымен қоздырылатын нұсқау.
Егер сәйкес catch нұсқасы үшін жоқ ерекше жағдайы қондырылса, онда
программаның қалыпты емес аяқталуы болуы мүмкін. Standart C ++
стандартына сәйкес өңделмейтін ереше жағдайдың қондырылуы terminate ( )
стандартты кітапханалық функцияның шақырылуына алып келеді. Үнсіздік
бойынша бағдарламаны аяқтау үшін terminate функциясы abort ( )
функциясын шақырады.
Ерекше жағдайды өңдеудің жай мысалы:
#include
int main(void)
{ cout «″ басы \n″;
try{ // try блогының басы
cout «″ try блогының ішінде \n″;
throw 10 // қатені қоздыру
cout «″ Бұл нұсқа орындалмайды! cout″;
} catch (int i) //қатені ұстап алу
51
cout «″ қате номері қамтылған : «″ i cout « endl;
}
cout «″ соңы ″;
return 0;
}
catch нұсқауын орындағанан кейін, бағдарламаны басқару одан кейінгі
келесі нұсқау беріледі.
Оған қарамастан, әдетте catch блогы exit ( ), abort( )
немесе қандай да бір функцияны шақырумен бағдарламаны мәжбүр етіп
аяқтайды.
Егер осы нұсқау try блогынан шақырылатын функцияға кірсе, онда
ерекше жағдай try блогына кірмейтін нұсқамен де қоздырылуы мүмкін.
try блогын функцияның ішінде орналастыруға болады. Мұндай
жағдайда, функцияға әрбір енген сайын ерекше жағдай өңдеушісі қайта
орнатылады.
Кейбір жағдайларда жүйені барлық ерекше жағдайлардың типіне
тәуелсіз, ұстап алатындай етіп баптау керек. Мұны өте оңай істеуге болады.
Ол үшін catch нұсқасының келесі формасын қолданыңыз:
сatch ( …) { //барлық ерекше жағдайларды өңдеу }
Мұндағы көпнүкте мәндердің кез келген типіне сәйкес келеді.
try блогынан шақырылатын функция үшін ерекше жағдай типтерінің
санын
шектеуге болады, оны осындай функция қоздыра алады. Нақтысында
функцияға қандай қандай да бір ерекше жағдайды қоздыруға тыйым салуға
болады. Ол үшін функцияның анықтамасына throw кілттік сөзін қосу керек:
Нәтиже_типі функция _аты (аргументтер_тізімі) throw (типтер_ тізімі)
{…}
Мұнда типтер тізімі өрісінде, функция қоздыра алатын, ерекше
жағдайлардың мәндер типтері үтірмен бөлініп келтірілген.
Басқа типті
ерекше жағдайды қоздыруды байқап көргенде, бағдарламаның авариялық
түрде аяқталуына алып келеді. Қоздыратын ерекше жағдайлар типтерін
шекте, функцияның try блогынан шақырғаннан кейін мүмкін болатындығын
түсіну керек. Яғни, функция ішінде try блогы ерекше жағдайдың кез келген
типін қоздыра алады, себебі ол осы функция ішінде ұсталынады.
Ерекше жағдайды қайта қоздыруға болады.
Мұның мағынасы,
әрқайсысы ерекше жағдайды өзінің аспектісінен өңдейтін бірнеше
процедураға, ерекше жағдайды өңдеуге мүмкіндік беру болып табылады.
Ерекше жағдай, осы блоктан шақырылатын кез келген функцияда немесе сatch
блогының ішінде ғана қайта қоздырылады.
Бір типті ерекше жағдайды қайта өңдеу мысалы: