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';
}
try va catch bloklari birgalikda ishlaydi. Try bloki unga kiritilgan har qanday istisnolarni aniqlaydi va ularni qayta ishlash uchun tegishli catch blokiga yo'naltiradi. Try blokida darhol o'zidan keyin kamida bitta catch bloki bo'lishi kerak, lekin u ketma-ket (birin-ketin) bir nechta catch bloklariga ega bo'lishi mumkin.
Istisno try bloki tomonidan ushlangan va ishlov berish uchun catch blokiga yo'naltirilgandan so'ng, u ishlov berilgan deb hisoblanadi (catch blok kodi bajarilgandan so'ng) va dasturning bajarilishi davom ettiriladi.
Catch parametrlari funksiya parametrlari bilan bir xil ishlaydi, bir catch blokining parametrlari boshqa catch blokida (uning orqasida joylashgan) mavjud. Asosiy ma'lumotlar turlaridan istisnolar qiymat bo'yicha ushlanishi mumkin (catch blokining parametri - qiymat), lekin keraksiz nusxa ko'chirishning oldini olish uchun asosiy bo'lmagan ma'lumotlar turlaridan istisnolar doimiy havola orqali ushlanishi kerak (catch blokining parametri doimiy mos yozuvlardir).
Funktsiyalarda bo'lgani kabi, agar parametr catch blokida ishlatilmasa, o'zgaruvchining nomini o'tkazib yuborish mumkin:
catch (double) // Eslatma: Biz o'zgaruvchining nomini ko'rsatmaymiz,
//chunki bunga ehtiyoj yo'q (biz uni blokning biron bir joyida ishlatmaymiz)
{
// Bu yerda double tipli istisno bilan ishlash
cerr << "Biz double turini istisno qildik" << '\n';
}
Bu kompilyatordan foydalanilmagan o'zgaruvchilar haqida ogohlantirishlarni ko'rsatishdan saqlaydi.
throw, try va catchdan birgalikda foydalanish
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!
throw iborasi int tipidagi istisno -1 ni tashlash uchun ishlatiladi. Keyin try bloki throw iborasini aniqlaydi va uni int tipidagi istisnolarni boshqaradigan tegishli catch blokiga o'tkazadi. Catch bloki int tipiga ega va tegishli xato xabarini chop etadi.
Istisnoni ko'rib chiqqandan so'ng, dastur o'z bajarilishini davom ettiradi va ekranda “Yo'limizni davom ettiramiz!” matni chiqadi.
Xulosa. Istisnolarni hal qilish aslida juda oddiy va siz eslab qolishingiz kerak bo'lgan hamma narsa quyidagi ikkita paragrafda yoritilgan:
Istisno o'rnatilganda (throw bayonoti), dasturni bajarish nuqtasi darhol eng yaqin try blokiga o'tadi. Agar try blokiga biriktirilgan catch ishlov beruvchilaridan birortasi ushbu turdagi istisnolarni bajarsa, u holda bajarish nuqtasi ushbu ishlov beruvchiga o'tadi va catch blok kodi bajarilgandan so'ng, istisno ishlov berilgan hisoblanadi.
Agar mos keladigan catch ishlov beruvchilari mavjud bo'lmasa, dasturning bajarilishi keyingi sinash blokida davom etadi. Agar dastur oxirigacha mos keladigan ushlagichlar topilmasa, dastur istisno xatosi bilan tugaydi.
Esda tutingki, kompilyator bloklarni ushlash uchun istisnolarni moslashtirganda yashirin konvertatsiyalarni amalga oshirmaydi! Masalan, char tipidagi istisno int tipidagi catch bloki tomonidan, int tipidagi istisno esa, o'z navbatida, float tipidagi catch bloki tomonidan ishlamaydi.
Bu haqiqatan ham eslab qolish kerak bo'lgan narsa.
Do'stlaringiz bilan baham: |