Konstruktor va destruktorlarda favqulotda holatlar
С++ tili konstruktor va destruktordan qiymat qaytarishga imkon bermaydi. Favqulotda holatlar mexanizmi obyekt konstruktori yoki destruktorida paydo bo’lgan xato haqida xabar berish imkoniyatiga ega. Misol uchun so’raladigan xotira chegaralangan Vector sinfini yaratamiz:
class Vector{
public:
class Size{}; // Favqulotda holat sinfi
enum {max = 32000}; // Vektor maksimal uzunligi
Vector(int n) // Konstruktor
{ if (n<0 || n>max) throw Size(); ... }
…
};
Vector sinfidan foydalanishda Size tipidagi favqulotda holatlarni ushlab qolish ko’zda tutilgan:
try{
Vector *р = new Vector(i);
…
}
catch(Vector::Size){
... // Vektor o’lchamidan xatoni qayta ishlash
}
Qayta ishlovchida xato va tiklash haqida xabarlarni berishning asosiy usullari standart jamlanmasi ishlatilishi mumkin. Favqulotda holatni aniqlovchi sinf ichida qayta ishlovchiga uzatiladigan favqulotda holat haqidagi ma’lumot saqlanishi mumkin. Bu texnikaning ma’nosi, xato haqidagi ma’lumotni xato topilgan nuqtadan xatoni qayta ishlash uchun yetarli imkoniyatlar bo’lgan joyga uzatishni ta’minlashdan iborat.
Agar obyekt konstruktorida favqulotda holat paydo bo’lsa, joriy momentiga bu blokda to’liq yaratilgan obyektlar uchun hamda obyektlar hisoblangan joriy obyekt ma’lumotlar maydonlari uchun va uning bazaviy sinflar uchun destruktorlar avtomatik chaqiriladi. Masalan, agar obyektlar massivlarni yaratishda favqulotda holat paydo bo’lsa, destruktorlar faqat muvaffaqiyatli yaratilgan elementlar uchun chaqiriladi.
Agar obyekr dinamik xotirada new amali yordamida bajarilsa va konstruktorda favqulotda holat paydo bo’lsa, obyekt uchun xotira to’g’ri ozod qilinadi.
Favqulotda holat shajaralari (iyerarxiyalari)
Favqulotda holatlar xos sinflardan foydalanish ma’lumotlar standart tiplarni qo’llashga qaraganda afzalroq. Sinflar yordamida favqulotda holat haqida ma’lumotni uzatish puxta tashkil etish, favqulotda holatlarni qayta ishlashni oson tabaqalashtirish mumkin, bundan tashqari, sinflar shajarasidan foydalanish imkoniyati paydo bo’ladi.
Favqulotda holatlarni boshqarish mexanizmi bazaviy sinf uchun qayta ishlovchini yaratishga imkon beradi, turdosh favqulotda holatlarni ko’pincha shajara ko’rinishida ifodalash mumkin. Umuman bazaviy sinfdan favqulotda holatlarni hosil qilib qayta ishlovchida polimorfizmdan foydalanib bazaviy sinfga murojaat yoki ko’rsatgichni ushlab qolish mumkin. Masalan, matematik kutubxonada sinflarni quyidagicha tashkil etish mumkin:
class Matherr{};
class Overflow: public Matherr{}; // To’lib ketish
class Underflow: public Matherr{}; // Tartib yo’qolishi
class ZeroDivide: public Matherr{}; // Nolga bo’lish
Kirish/chiqish xatolarini ifoda qilish uchun quyidagi sinflardan foydalanish mumkin:
class IOerr{};
class Readerr: public IOerr{}: // O’qish xatosi
class Writerr: public IOerr{}; // Yozish xatosi
class Seekerr: public IOerr{}; // Izlash xatosi
Sharoitga bog’liq ravishda hosilaviy favqulotda holatlarni ushlab (tutib) oladigan bazaviy sinf favqulotda holatlarini qayta ishlovchisini yoki hosila sinflar xos qayta ishlovchilaridan foydalanish mumkin.
C++ ning amallar yoki funksiyalari bilan hosil qilinuvchi qator standart favqulotda holatlari mavjud. Ularning barchasi sarlavha faylida tasvirlangan exception kutubxona sinfining hosilalari hisoblanadi. Masalan, new amali muvaffaqiyatsiz xotira ajratilganda bad_alloc tipidagi favqulotda holatni paydo qiladi.
Dasturchi standartlardan hosilalar bo’lgan xos favqulotda holatlarni aniqlashi mumkin.0>
Do'stlaringiz bilan baham: |