244
cout << "Аластама генерациялаймыз" << endl;
throw "Файл ашуда қате кетті";}
}
void f2(){
Hello H; // Жергілікті объект құрамыз
f1(); // Аластама генерациялайтын
// функцияны шақырамыз
}
int main(){
try{
cout << "try-блокқа кіреміз" << endl;
f2();
cout << "try-блоктан шығамыз" << endl;
}
catch(int i){
cout << "int өңдеуіші шақырылды, аластама - "
<< i << endl;
return -1;
}
catch(const char * p){
cout << "const char* өңдеуіші шақырылды,
аластама - " << p << endl;
return -1;
}
сatch(...){
cout << "Барлық аластамалардың өңдеуіші
шақырылды" << endl;
return -1;
}
return 0; // Барлығы сəтті орындалды
}
Программаның орындалу нəтижесі:
try-блокқа кіреміз
Hello!
Аластама генерациялаймыз
Bye!
const char * өңдеуіші шақырылды, аластама – Файл ашуда
қате кетті
Аластаманың туындауынан кейін
f1
функциясынан басқару
main
функци-
ясында орналасқан өңдеуішке берілгендігіне қарамастан, жергілікті объектінің
деструкторы шақырылғанына назар аударыңыздар. Мұнда «
try
-блоктан
шығамыз» хабарламасы шығарылған жоқ. Программада файлмен жұмыс істеу
үшін ағымдар қолданылды (олар туралы «Ағымдық кластар» бөлімінде, 283 б.
жазылады).
245
Сонымен, аластамалар механизмі қателіктер туындаған кезде объектілерді
дұрыс жоюға мүмкіндік береді. Сондықтан ресурстарды бөлу жəне босатуды
кластар түрінде ұйымдастырған тиімді болып саналады, өйткені олардың
конструкторы ресурсты бөледі, ал деструкторы – босатады. Мысал ретінде
файлмен жұмыс істеуге арналған класты келтіруге болады. Класс конструк-
торы файлды ашады, ал деструкторы – жабады. Мұндайда қателік туындаған
кезде файл дұрыс жабылып, ақпарат жойылмайтынына кепілдік берілетінін
айтуға болады.
Жоғарыда көрсетілгендей, аластама стандартты немесе қолданушы
анықтаған типте болуы мүмкін. Бұл типті ауқымды түрде анықтаудың қажеті
жоқ, оның аластама туындаған нүктеде жəне аластаманы өңдеу нүктесінде
белгілі болуы жеткілікті. Аластаманы бейнелейтін класты, онымен жұмыс
істегенде осы аластама туындауы мүмкін басқа кластың ішінде сипаттауға бо-
лады. Осы кластың көшірме конструкторы
public
болып жариялануы тиіс,
өйткені оған кері жағдайда аластама туындағанда объектінің көшірмесін құру
мүмкін болмай қалады (келісім бойынша құрылатын көшірме конструкторының
спецификаторы
public
болады).
Достарыңызбен бөлісу: