Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Освой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π‘++ Π·Π° 21 дСнь.Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 140

Автор ДТСсс Π›ΠΈΠ±Π΅Ρ€Ρ‚ΠΈ

Π’ строках 61β€”68 ΠΈ 71β€”78 ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ индСксирования ([]) Π·Π°ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ индСкс смСщСния ΠΈ, Ссли ΠΎΠ½ΠΎ окаТСтся Π²Π½Π΅ допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ классу xBoundary для создания ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. НазначСниС ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ конструктору класса xBoundary ΠΎΡ‚ использования константы пСрСчислСния. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ компиляторы ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Microsoft Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² любом случаС Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Π»ΠΎΡΡŒ строкой с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ return, ΡΠΎΠ³Π»Π°ΡΡƒΡŽΡ‰Π΅ΠΉΡΡ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ с ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ссылки Π½Π° цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅), нСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ Π² случаС возникновСния ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации Π² строкС 66 Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ достигнСт строки 67. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ логичСскиС ошибки Π½Π΅ Ρ‡ΡƒΠΆΠ΄Ρ‹ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Microsoft!

Π’ строкС 90 ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом try начинаСтся Π±Π»ΠΎΠΊ отслСТивания ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ оканчиваСтся Π² строкС 97. Π’Π½ΡƒΡ‚Ρ€ΠΈ этого Π±Π»ΠΎΠΊΠ° Π² массив, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΉ Π² строкС 89, добавляСтся 101 Ρ†Π΅Π»ΠΎΠ΅ число.

Π’ строкС 98 объявлСн Π±Π»ΠΎΠΊ catch для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ класса xBoundary.

Π’ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π² строках 87β€”104 создаСтся Π±Π»ΠΎΠΊ try, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ инициализируСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‡Π»Π΅Π½ массива. Когда пСрСмСнная j (строка 92) увСличится Π΄ΠΎ 20, осущСствляСтся доступ ΠΊ Ρ‡Π»Π΅Π½Ρƒ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ 20. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π½Π΅Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ условия ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² строкС 64, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ Π·Π°ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ индСксирования operator[] Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ класса xBoundary (строка 66).

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ пСрСдаСтся ΠΊ Π±Π»ΠΎΠΊΡƒ catch Π² строкС 98, ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ пСрСхватываСтся ΠΈΠ»ΠΈ обрабатываСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ catch Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ строкС, которая ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π±Π»ΠΎΠΊΠ° catch Π² строкС 100.


Π‘Π»ΠΎΠΊ отслСТивания ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций

Π­Ρ‚ΠΎΡ‚ Π±Π»ΠΎΠΊ прСдставляСт собой Π½Π°Π±ΠΎΡ€ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом try, 3a ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ фигурная скобка; Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π±Π»ΠΎΠΊ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽ- Ρ‰Π΅ΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобкой. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

try

{

   Function();

}


Π‘Π»ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»Ρ‚Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠΈΡ‹Ρ… ситуаций

Π­Ρ‚ΠΎΡ‚ Π±Π»ΠΎΠΊ прСдставпяСт собой Π½Π°Π±ΠΎΡ€ строк, каТдая ΠΈΠ· Π½ΠΈΡ… начинаСтся ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом catch, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Ρ‚ΠΈΠΏ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках. Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ фигурная скобка. Π—Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π±Π»ΠΎΠΊ-catch Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобкой.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

try

{

   Function();

}

catch (OutOfMemory)

{

   // выполняСм дСствиС

}

ИспользованиС блоков try и catch

Часто Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ просто Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΊΡƒΠ΄Π° ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈ try, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ всСгда ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ дСйствия ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ вопрос состоит Π² Ρ‚ΠΎΠΌ, Π³Π΄Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, связанныС с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΏΠ°ΠΌΡΡ‚ΡŒ распрСдСляСтся, Π½ΠΎ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ стоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² высокоуровнСвой части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, связанной с интСрфСйсом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ мСстополоТСниС Π±Π»ΠΎΠΊΠ° try выяснитС, Π³Π΄Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ происходит распрСдСлСниС памяти ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… рСсурсов. ΠŸΡ€ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, связанных с Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π·Π° допустимыС ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹, Π²Π²ΠΎΠ΄ΠΎΠΌ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΡ€., Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹.

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Когда гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, исслСдуСтся стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Он прСдставляСт собой список ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ ΠΊ функциям, создаваСмый ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π‘Ρ‚Π΅ΠΊ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² отслСТиваСт ΠΏΡƒΡ‚ΡŒ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Если функция main() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Animal::GetFavoriteFood(), Π° функция GetFavoriteFood() β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Animal::LookupPreferences(), которая, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fstream::operator>>(), Ρ‚ΠΎ всС эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ заносятся Π² стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². РСкурсивная функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ пСрСдаСтся Π² стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. По ΠΌΠ΅Ρ€Π΅ прохоТдСния стСка Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ дСструкторы для Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π·Ρ€ΡƒΡˆΠ°ΡŽΡ‚ΡΡ.

Π—Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π±Π»ΠΎΠΊΠΎΠΌ try слСдуСт ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π±Π»ΠΎΠΊΠΎΠ² catch. Если сгСнСрированноС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ соотвСтствуСт ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² catch, Ρ‚ΠΎ выполняСтся ΠΊΠΎΠ΄ Π±Π»ΠΎΠΊΠ° этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. Если ΠΆΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ Π½Π΅ соотвСтствуСт Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² catch, ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ стСка продолТаСтся.

Если ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΉΠ΄Π΅Ρ‚ вСсь ΠΏΡƒΡ‚ΡŒ ΠΊ Π½Π°Ρ‡Π°Π»Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main()) ΠΈ всС Π΅Ρ‰Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ, вызываСтся встроСнный ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

ΠŸΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎ стСку ΠΌΠΎΠΆΠ½ΠΎ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠ΅Π·Π΄ΠΊΠΎΠΉ ΠΏΠΎ ΡƒΠ»ΠΈΡ†Π΅ с односторонним Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ. По ΠΌΠ΅Ρ€Π΅ прохоТдСния стСка Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π·Ρ€ΡƒΡˆΠ°ΡŽΡ‚ΡΡ. Назад Π΄ΠΎΡ€ΠΎΠ³ΠΈ Π½Π΅Ρ‚. Если ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ послС Π±Π»ΠΎΠΊΠ° catch, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΠ» это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² листингС20.1 Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ продолТится со строки 101 β€” ΠΏΠ΅Ρ€Π²ΠΎΠΉ строки послС Π±Π»ΠΎΠΊΠ° try catch, ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΠ²ΡˆΠ΅Π³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ xBoundary. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ продолТаСтся послС Π±Π»ΠΎΠΊΠ° catch, Π° Π½Π΅ послС Ρ‚ΠΎΠ³ΠΎ мСста, Π³Π΄Π΅ ΠΎΠ½Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π°.

ИспользованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² catch

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ выраТСния ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ возникновСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций. Π’ этом случаС Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² catch, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ конструкции с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ switch. ΠŸΡ€ΠΈ этом эквивалСнтом ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° default Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ catch(.,,), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слСдуСт ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ "ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ всС". ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 20.2.

Листинг 20.2. ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅Π½Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

1: #include <iostream.h>

2:

3: const int DefaultSize = 10;

4:

5: class Array

6: {

7:    public:

8:       // конструкторы

9:       Array(int itsSize = DefaultSize);

10:      Array(const Array &rhs);

11:      ~Array() { delete [] pType;}

12:

13:      // ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

14:      Array& operator=(const Array&);

15:      int& operator[](int offSet);

16:      const int& operator[](int offSet) const;

17:

18:      // ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступа

19:      int GetitsSize() const { return itsSize; }

20:

21:      //функция-Π΄Ρ€ΡƒΠ³

22:      friend ostream& operator<< (ostream&, const Array&);

23:

24:      // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

25:      class xBoundary { } ;

26:      class xTooBig { } ;

27:      class xTooSmall { } ;

28:      class xZero { } ;

29:      class xNegative { } ;

30:   private:

31:      int *pType;

32:      int itsSize;

33: };

34:

35: int& Array::operator[](int offSet)

36: {

37:    int size = GetitsSize();

38:    if (offSet >= 0J,& offSet < GetitsSize())

39:    return pType[offSet];

40:    throw xBoundary();

41:    return pType[0]; // Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ компилятора

42: }

43:

44:

45: const int& Array::operator[](int offSet) const

46: {

47:    int mysize = GetitsSize();

48:    if (offSet >= 0 && offSet < GetitsSize())

49:       return pType[offSet]

50:    throw xBoundary();

51:

52:    return pType[0]; // Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ компилятора

53: }

54:

55:

56: Array::Array(int size):

57: itsSize(size)

58: {

59:    if (size == 0)

60:       throw xZero();

61:    if (size < 10)

62:       throw xTooSmall();

63:    if (size > 30000)

64:       throw xTooBig();

65:    if (size < 1)

66:       throw xNegative();

67:

68:    pType = new int[size];

69:    for (int i = 0; i<size: i++)

70:       pType[i] = 0;

71: }

72:

73:

74:

75: int main()

76: {

77:

78:    try

79:    {

80:       Array intArray(0);

81:       for (int j = 0; j< 100; j++)

82:       {

83:          intArray[j] = ];

84:          cout << "intArray[" << j << "] okay...\n";

85:       }

86:    }

87:    catch (Array::xBoundary)

88:    {

89:       cout << "Unable to process your input!\n";

90:    }

91:    catch (Array::xTooBig)

92:    {

93:       cout << "This array is too big...\n";

94:    }

95:    catch (Array::xTooSmall)

96:    {

97:       cout << "This array is too small...\n";

98:    }

99:    catch (Array::xZero)

100:   {

101:      cout << "You asked for an array";

102:      cout << " of zero objects!\n";

103:   }

104:   catch (... )

105:   {

106:      cout << "Something went wrong!\n";

107:   }

108:   cout << "Done.\n";

109:   return 0;

110: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

You asked for an array of zero objects!

Done


Анализ: Π’ строках 26β€”29 создаСтся Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π½ΠΎΠ²Ρ‹Ρ… класса: xTooBig, xTooSmall, xZero ΠΈ xNegative. Π’ строках 56β€”71 провСряСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ массива, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ конструктору. Если ΠΎΠ½ слишком Π²Π΅Π»ΠΈΠΊ ΠΈΠ»ΠΈ ΠΌΠ°Π», Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ»ΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ, гСнСрируСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π—Π° Π±Π»ΠΎΠΊΠΎΠΌ try слСдуСт нСсколько ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² catch для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации, ΠΊΡ€ΠΎΠΌΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, связанного с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π”Π°Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ пСрСхватываСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ catch(. ..) Π² строкС 104.