Istisnolar generatsiyasi. Muayyan voqealar sodir bo'lganligini ko'rsatish uchun biz doimo haqiqiy hayotda signallardan foydalanamiz. Misol uchun, basketbol o'yini paytida, agar o'yinchi jiddiy qoidabuzarlik qilsa, hakam hushtagi chaladi va o'yin to'xtatiladi. Keyin erkin to'pni to'plash keladi. Erkin to'p to'planishi bilanoq o'yin qayta boshlanadi.
C++ da throw iborasi istisno yoki xato haqida signal berish uchun ishlatiladi (hakam hushtak chalgandagi kabi). Istisno sodir bo'lganligi haqida signal berish istisnoni generatsiyasi deb ataladi.
throw operatoridan foydalanish uchun siz throw kalit so'zidan keyin xato haqida signal berish uchun foydalanmoqchi bo'lgan har qanday ma'lumot turi qiymatidan foydalanasiz. Odatda, bu qiymat xato kodi, muammoning tavsifi yoki maxsus istisno sinfidir. Masalan:
Istisno bilan ishlash.Hakam erkin to'pni e'lon qilmaguncha va to'p maydonga tashlanmaguncha o'yin qayta boshlanmaydi. Boshqacha qilib aytadigan bo'lsak, o'yinni davom ettirishdan oldin erkin to'pni qayta tashlash kerak.
Aslida, istisnolarni qayta ishlash catch blokining ishi. catch kalit so'zi ma'lum bir turdagi ma'lumotlarning istisnolarini ko'rib chiqadigan kod blokini ("catch bloki" deb ataladi) aniqlash uchun ishlatiladi.
Bu yerda int tipidagi istisnolarni ko‘rib chiqadigan (tutadigan) catch blokiga misol:
catch (int a)
{
// int tipidagi istisno bilan ishlash
cerr << "Biz qiymat bilan int istisnosini ushladik" << a << '\n';
}
3-misol. Bu yerda throw, try va catch bloklaridan foydalanadigan to'liq dastur:
#include
#include using namespace std;
int main()
{
try
{
// Bu erda biz keyingi istisnolarni tashlaydigan bayonotlarni yozamiz
throw -1; // odatiy throw bayonoti
}
catch (int a)
{
// Yuqoridagi try blokiga kiritilgan int turidagi har qanday istisnolar shu yerda ko'rib chiqiladi
cerr << "Biz qiymat bilan int istisnosini ushladik: " << a << '\n';
}
catch (double) // biz o'zgaruvchining nomini ko'rsatmaymiz, chunki bunga ehtiyoj yo'q (biz uni blokning biron bir joyida ishlatmaymiz)
{
// Yuqoridagi try blokiga kiritilgan double turidagi har qanday istisnolar shu yerda ko'rib chiqiladi
cerr << "Biz double turini istisno qildik" << '\n';
}
catch (const string &str) // doimiy havola orqali istisnolarni ushlang
{
// Yuqoridagi try blokiga kiritilgan har qanday turdagi string istisnolari bu yerda ko'rib chiqiladi
cerr << "Biz string turini istisno qildik" << '\n';
}
cout << "Yo'limizni davom ettiramiz!\n";
return 0;
}
Dasturni bajarish natijasi:
Biz -1 qiymatiga ega int istisnosini ushladik
Yo'limizni davom ettiramiz!
4-misol. Bu yerda istisnolar darhol hal qilinishini ko'rsatadigan kichik dastur:
#include
using namespace std;
int main()
{
try
{
throw 7.4; // double tipidagi istisno tashlanadi
cout << "Bu hech qachon chop etilmaydi\n";
}
catch(double a) // double tipdagi istisno ishlanadi
{
cerr << "Bu double tipidagi qiymat: " << a << '\n';
}