7-bob favqulotda holatni qayta ishlash


Favqulotda holatni ilib olish



Download 50,84 Kb.
bet3/5
Sana18.07.2022
Hajmi50,84 Kb.
#818930
1   2   3   4   5
Bog'liq
7-Favqulotda holatni qayta ishlash

Favqulotda holatni ilib olish

throw yordamida favqulotda holat hosil qilinganda C++ bajaruvchi kutubxona funksiyasi quyidagi amallarni bajaradi:



  1. favqulotda holat qayta ishlamaguncha mavjud bo’ladigan statik obyekt ko’rinishida throw parametri nusxasini yaratadi;

  2. tegishli qayta ishlovchini izlash jarayonida amal qilish sohasidan chiquvchi lokal obyektlar destruktorlarini chaqirib stekka yoyadi;

  3. bu obyekt bilan tip bo’yicha muvofiq parametrga ega qayta ishlovchiga obyekt va boshqaruvni beradi.

Stekni yoyishda barcha qayta ishlovchilar har bir saviyada ketma-ket, ichki blokdan tashqarisiga tegishli qayta ishlovchi topilmaguncha qarab chiqiladi.


Qayta ishlovchi topilgan deb hisoblanadi, agar throw dan keyin ko’rsatilgan obyekt tipi:

  • catch parametrida ko’rsatilgan bilan bir xil bo’lsa (parametr T, const T, &T yoki const T& shaklida yozilishi mumkin, bu yerda T favqulotda holat tipi);

  • catch parametrida ko’rsatilgandagining hosilasi bo’lsa (agar vorislik public kirish kaliti bilan amalga oshirilgan bo’lsa);

  • ko’rsatgichlarni almashtirish standart qoidalari bo’yicha catch parametridagi ko’rsatgich tipiga almashtirish mumkin bo’lgan ko’rsatgichdan iborat bo’lsa.

Yuqoridagilardan, hosila sinflar qayta ishlovchilarini bazaviy qayta ishlovchilargacha joylashtirish lozim, chunki aks holda hech qachon ularga boshqaruv berilmaydi. void tipidagi ko’rsatgich qayta ishlovchisini avtomatik ravishda ixtiyoriy boshqa tipdagi ko’rsatgichini yashiradi, shuning uchun uni ham konkret tipdagi ko’rsatgichlar qayta ishlovchilaridan keyin joylashtirish lozim.
Misol qaraymiz:
#include
class Hello{
// O’zining yaratilish va yo’qotilish haqida ma’lumot beruvchi sinf
public:
Hello(){cout << "Hello!" << endl;}
~Hello(){cout << "Bye!" << endl;}
};
void fl(){
ifstream ifs("\\INVALID\\FILE\\NAME"); // Faylni ochamiz
if (!ifs){
cout << "Favqulotda holatni hosil qilamiz" « endl;
throw "Faylni ochishda xato";}
}
void f2(){
Hello Н; // Lokal obyekt yaratamiz
f l(); // Favqulotda holatni hosil qiluvchi funksiyani chaqiramiz
}
int main(){
try{
cout << "try-blokka kiramiz" << endl;
f2();
cout << "try-blokdan chiqamiz" << endl;
}
catch(int i){
cout << "int qayta ishlovchi chaqirilgan favqulotda holat -" << i <return -1;
}
catch(const char * p){
cout << "const char* qayta ishlovchi chaqirilgan favqulotda holat - "
<< p << endl;
return -1;
}
catch(…){
cout << "Barcha favqulotda holatlar qayta ishlovchisi chaqirilgan" << endl;
return -1;
}
return 0; // Barchasi muvaffaqiyatli tugadi
}

Dasturni bajarish natijalari


try-blokka kiramiz
Hello!
Favqulotda holatni hosil qilamiz
Bye!
const char * qayta ishlovchi chaqirilgan. Favqulotda holat fayli ochishda xato.
E’tibor qiling, favqulotda holat hosil bo’lgandan so’ng lokal obyekt destruktori chaqrildi, vaholangki f1 funksiyadagi boshqaruv main funksiyasida joylashgan qayta ishlovchiga uzatilgan edi. “try-blokdan chiqamiz” xabari chiqarilmadi. Fayl bilan ishlash uchun dasturda oqimlardan foydalanildi.
Shunday qilib, favqulotda holatlar mexanizmi xato vaziyatlar paydo bo’lganda obyektlarni to’g’ri yo’qotishga imkon beradi. Shuning uchun zahiralarni ajratish va tozalashni konstruktori zahira ajratuvchi, destruktori tozalaydigan sinflar ko’rinishida rasmiylashtirish foydali. Misol uchun fayl bilan ishlash sinfini keltirish mumkin. Sinf konstruktori faylni ochadi, destruktori yopadi. Bu holda xato paydo bo’lganda fayl to’g’ri yopilishi va ma’lumot yo’qolmasligi kafolati mavjud.
Favqulotda holat standart tipda hamda foydalanuvchi aniqlagan tipda bo’lishi mumkin. Bunda bu tipni global aniqlash zarurati yo’q, u favqulotda holat paydo bo’lish nuqtasida va uni qayta ishlash nuqtasida ma’lum bo’lishi yetarli. Fayqulotda holatni taqdim etish uchun sinfni u bilan ishlashda paydo bo’lishi mumkin bo’lgan sinf ichida tavsiflash mumkin. Bu sinfning nusxalash konstruktori public kabi e’lon qilinishi lozim, chunki aks holda favqulotda holatni hosil qilishda obyekt nusxasini yaratish mumkin bo’lmaydi (jimlik bo’yicha yaratiladigan nusxalash konstruktori public spitsifikatorga ega).



Download 50,84 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5




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

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish