Xotirani tozalash uchun funktsional try blokidan foydalanmang
Agar ob'ektni yaratish operatsiyasi muvaffaqiyatsiz bo'lsa, u holda sinf destruktori chaqirilmaydi. Shuning uchun siz sinfga ajratilgan xotiraning bir qismini tozalash uchun funktsional tr foydalanish vasvasasiga tushishingiz mumkin. Biroq, ob'ektning yaratilmagan a'zolariga kirish aniqlanmagan xatti-harakatlar hisoblanadi, chunki ob'ekt catch bloki ishga tushishidan oldin ham "o'lik" bo'ladi. Bu sinfni tozalashni amalga oshirish uchun funktsional sinash blokidan foydalana olmasligingizni anglatadi.
Xulosa
Funktsional try bloklari, asosan, xatolarni murojaatlar to'plamiga o'tkazishdan oldin jurnal fayliga yozish yoki istisno turini o'zgartirish uchun foydalidir.
try
{
runGame();
}
catch(...)
{
cerr << "Abnormal termination\n";
}
saveState(); // o'yinchining joriy holatini saqlash
return 1;
}
Misol. Xatoliklarni ushlash uchun Exception sinfini yarating. Throw va catch dan foydalanib oddiy matn kiritilganda istisnoni generatsiya qiling.
#include
#include
using namespace std;
class Exception
{
private: string m_msg;
public:
Exception(const string& msg)
{
m_msg = msg;
}
string getMessage() const
{
return(m_msg);
}
~Exception()
{
}
};
void f()
{
throw(Exception("Xatolik!"));
}
int main()
{
try
{
f();
}
catch(Exception& e)
{
cout << "Sizda istisno bor: " << e.getMessage( ) << endl;
}
}
Misol. Stack nomli sinf hosil qiling. Uning tarkibida element qo’shish va element olib tashlash metodlari bo’lsin. Stek to’lib ketganda va stekda element mavjud bo’lmaganda istisnoni generatsiya qiling.
#include
using namespace std;
const int MAX = 3; //Stekka maksimum 3 ta butun
//qo'shish mumkinligini belgilash
class Stack
{
private:
int st[MAX]; // stek: butunsonli massiv
int top; // stening yuqori indeksi
public:
class Range // Stack uchun istisnoli sinf
{ // Diqqat: sinfning tanasi bo'sh
};
Stack() //konstruktor
{
top = -1;
}
void push(int var)
{
if(top >= MAX - 1) // agar stek to'lgan bo'lsa,
throw Range(); // istisno generatsiya qilamiz
st[++top] = var; // aks holda stekka sonni yozamiz
}
int pop()
{
if(top < 0) // agar stek bo'sh bo'lsa,
throw Range(); // istisno
return st[top--]; // stekdan sonni olib tashlash
}
};
int main()
{
Stack s1;
try
{
s1.push(11);
s1.push(22);
s1.push(33);
// s1.push(44); // Stek to'lgan
cout << "1: " << s1.pop() << endl;
cout << "2: " << s1.pop() << endl;
cout << "3: " << s1.pop() << endl;
cout << "4: " << s1.pop() << endl; // Stek bo'sh
catch(Stack::Range) // ishlab chiqish
{
cout << "Istisno: Stek to'lgan yoki bo'sh"<< endl;
}
cout << "Istisno (yoki oddiy chiqish)ni qo'lga kiritgandan keyin bu yerga keldim" << endl;
return 0;
}
Misol. Distance (Masofa) nomli sinf hosil qiling. Uning maydonlari butun sonli fut va haqiqiy tipdagi dyum qiymatlaridan iborat. Bunday holda, dyum qiymati 12.0 dan oshmasligi kerak. Agar belgilangan shart bajarilmasa istisnolarni generatsiya qiling.
#include
using namespace std;
class Distance //
{
private:
int feet;
float inches;
public:
class InchesEx { }; //istisno sinf
//---------------------------------------------------------
Distance()
{
feet = 0;
inches = 0.0;
}
Distance(int ft, float in)
{
if(in >= 12.0) // dyum noto'g'ri ko'rsatilgan bo'lsa,
throw InchesEx(); //istisno generatsiya qilinsin
feet = ft;
inches = in;
}
void getdist() // foydalanuvchidan uzunlikni oling
{
cout << "\n Futni kiriting: "; cin >> feet;
cout << "Dyumni kiriting: "; cin >> inches;
if(inches >= 12.0) // agar dyum noto'g'ri kiritilgan bo'lsa,
throw InchesEx(); // istisno generatsiya qilinsin
}
//---------------------------------------------------------
void showdist() // masofani chop etish
{
cout << feet << "\'-" << inches << '\"'; }
};
///////////////////////////////////////////////////////////
int main()
{
try
{
Distance dist1(17, 3.5);
Distance dist2;
dist2.getdist();
cout << "\ndist1 = "; dist1.showdist();
cout << "\ndist2 = "; dist2.showdist();
}
catch(Distance::InchesEx) // istisnolarni ushlash
{
cout << "\nInitsializatsiya xato: dyuym chegaradan oshib ketdi.";
}
cout << endl;
return 0;
}
Do'stlaringiz bilan baham: |