Barcha turdagi istisnolar uchun qayta ishlovchilar. Va endi topishmoq: "Funktsiyalar har qanday ma'lumot turidagi istisnolarni tashlashi mumkin va agar istisno ushlanmasa, u stekni bo'shatadi va butun dasturni potentsial ravishda to'xtatadi. Biz funktsiyalarni ularning bajarilishini bilmasdan chaqira oladigan bo'lsak (va shuning uchun ular qanday istisnolar qo'yishi mumkin), buni qanday oldini olishimiz mumkin? "
Yaxshiyamki, C ++ tili bizga barcha turdagi istisnolarni aniqlash / boshqarish mexanizmini taqdim etadi - catch-all ishlov beruvchi. Hammasini ushlab turadigan ishlov beruvchi oddiy catch bloki bilan bir xil ishlaydi, faqat ma'lum bir ma'lumot turidagi istisnolarni ko'rib chiqish o'rniga u ma'lumotlar turi sifatida uchta nuqtadan (...) foydalanadi va biz allaqachon bilganimizdek, … istalgan turdagi ma'lumotlarning argumentlarini funksiyaga o'tkazish uchun ishlatilishi mumkin. Shu nuqtai nazardan, ular har qanday turdagi ma'lumotlarning istisnolarini ifodalaydi. Mana oddiy misol:
#include int main()
{
try
{
throw 7; // int tipidagi istisno genratsiya qilinadi
}
catch (double a)
{
cout << "Biz double turidagi istisnoni ushladik: " << a << '\n';
}
catch (...) // catch-all
{
cout << "Biz aniqlanmagan turdagi istisnoni qo'lga oldik!\n";
}
}
int uchun maxsus catch ishlov beruvchisi mavjud emasligi sababli, catch-all ishlov beruvchi bu istisnoni ushlaydi. Shunday qilib, natija:
“Biz aniqlanmagan turdagi istisnoni qo'lga oldik!”
Hammasini ushlab turuvchi tutqich 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.
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.