catch-all ishlov beruvchisi catch bloklari zanjirida oxirgi bo'lishi kerak. Shunday qilib, istisnolar birinchi navbatda ma'lum ma'lumotlar turlariga moslashtirilgan (agar ular umuman mavjud bo'lsa) ushlagichlar tomonidan ushlanishi mumkin. Bu boshqa kompilyatorlar haqida Visual Studio'da nazorat qilinadi - bunday cheklov mavjudligiga ishonchim komil emas.
Ko'pincha catch-all ishlov beruvchi bloki bo'sh qoladi:
catch(...) {}
Ushbu ishlov beruvchi har qanday kutilmagan istisnolarni ushlaydi va stekni yechishning oldini oladi (va shuning uchun butun dasturni potentsial ravishda to'xtatadi), lekin bu yerda hech qanday istisno bilan ishlashni amalga oshirmaydi.
main() funksiyasida catch-all ishlov beruvchisidan foydalanish
Quyidagi dasturni ko'rib chiqaylik:
#include
using namespace std;
int main()
{
try
{
runGame();
}
catch(...)
{
cerr << "Abnormal termination\n";
}
saveState(); // o'yinchining joriy holatini saqlash
return 1;
}
Bunday holda, agar runGame() funksiyasi yoki runGame() da chaqirilgan har qanday funksiya yuqoridagi stekdagi funksiyalar tomonidan ushlanmaydigan istisnolarni keltirib chiqarsa, u oxir-oqibat catch-all ishlov beruvchisida tugaydi. Bu main() ni to'ldirishga to'sqinlik qiladi va bizga tanlagan xato xabarini ko'rsatish imkoniyatini beradi va keyin dastur chiqmaguncha foydalanuvchi holatini saqlab qoladi. Bu kutilmagan muammolarni aniqlash va tuzatish uchun foydali bo'lishi mumkin.
Istisno sinflar va merosxo’rlik
Operatorni qayta yuklashdagi istisnolar. Oddiy butun sonli massiv sinfi uchun indekslash operatorining quyidagi qayta yuklanishini ko'rib chiqaylik:
int& ArrayInt::operator[](const int index)
{
return m_data[index];
}
Garchi bu funksiya yaxshi ishlayotgan bo'lsa-da, u faqat o'zgaruvchi indeks qiymati to'g'ri massiv indeksi bo'lsagina ishlaydi. Bu yerda xatolarni qayta ishlash mexanizmining yetishmasligi aniq. Indeksni tasdiqlash uchun assert bayonotini qo'shamiz:
int& ArrayInt::operator[](const int index)
{
assert (index >= 0 && index < getLength());
return m_data[index];
}
Endi, agar foydalanuvchi noto'g'ri indexga o'tsa, dastur xatoga yo'l qo'yadi. Garchi bu foydalanuvchiga nimadir noto'g'ri ketganligi haqida xabar bersa ham, eng yaxshi variant callerga nimadir noto'g'ri bo'lganligi haqida “jimgina” xabar berish va unga buni aniqlashga imkon berishdir (biz aniq qanday qilib yozamiz).
Afsuski, operatorning qayta yuklanishi qabul qilishi va qaytarishi mumkin bo'lgan parametrlar soni va turiga maxsus talablarga ega bo'lganligi sababli, murojaat qiluvchiga xato kodlari yoki mantiqiy ma'lumotlarni uzatish uchun moslashuvchanlik yo'q. Biroq, biz funksiya signaturasi o'zgartirmaydigan istisnolardan foydalanishimiz mumkin, masalan:
int& ArrayInt::operator[](const int index)
{
if (index < 0 || index >= getLength())
throw index;
return m_data[index];
}
Endi, agar foydalanuvchi noto'g'ri index ni kiritsa, [] operatori int istisnosini chiqaradi.
Do'stlaringiz bilan baham: |