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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C++. Π‘Π±ΠΎΡ€Π½ΠΈΠΊ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΎΠ²Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 84

Автор Π”. БтСфСнс

}

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π² C++ (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π² Java ΠΈ Π‘#) - это способ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ сообщСниС Π² Π±ΡƒΡ‚Ρ‹Π»ΠΊΡƒ, Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π΅Π΅ Π·Π° Π±ΠΎΡ€Ρ‚ ΠΈ Π½Π°Π΄Π΅ΡΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ пытаСтся Π½Π°ΠΉΡ‚ΠΈ вашС сообщСниС Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½ΠΈΠΆΠ΅ ΠΏΠΎ стСку Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². Π­Ρ‚ΠΎ являСтся Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΈΠΌ, Π±ΠΎΠ»Π΅Π΅ простым ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, ΠΊΠΎΠ³Π΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, возвращаСтся ΠΊΠΎΠ΄ ошибки ΠΈΠ»ΠΈ выдаСтся сообщСниС ΠΎΠ± ошибкС. Π‘Π΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠ° использования ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Β«ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° выполнСния» ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ дСйствий, «выбрасываниС» ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π΅Π³ΠΎ Β«ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΎΠΌΒ») отличаСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π‘++, поэтому ΠΏΠ΅Ρ€Π΅Π΄ описаниСм способа создания класса ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ я ΠΊΡ€Π°Ρ‚ΠΊΠΎ ΠΎΡ‚Π²Π΅Ρ‡Ρƒ Π½Π° вопрос, Ρ‡Ρ‚ΠΎ прСдставляСт собой ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ.

Когда Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ситуация ΠΈ Π²Ρ‹ ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ освСдомлСна ΠΎΠ± этом, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Β«ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ вашС сообщСниС Π² Π±ΡƒΡ‚Ρ‹Π»ΠΊΡƒΒ» Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ throw, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

throw(Exception("Something went wrong"));

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ срСда Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния сконструируСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Exception (ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅), ΠΈ Π·Π°Ρ‚Π΅ΠΌ начинаСтся раскрутка стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ найдСтся Π±Π»ΠΎΠΊ try, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» сдСлан Π²Ρ…ΠΎΠ΄, Π½ΠΎ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅Ρ‰Π΅ Π½Π΅ сдСлан Π²Ρ‹Ρ…ΠΎΠ΄. Если срСда Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Π±Π»ΠΎΠΊ, Ρ‚.Π΅. достигнСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main (ΠΈΠ»ΠΈ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° вычислСний), ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ дальшС Ρ€Π°ΡΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ стСк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², вызываСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ глобальная функция terminate. Но Ссли Π±Π»ΠΎΠΊ try Π½Π°ΠΉΠ΄Π΅Π½, Ρ‚ΠΎ просматриваСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ catch для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° try ΠΈ находится Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½. ΠŸΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°.

catch(Exception& Π΅) { //...

Π’ этом мСстС Π½Π° основС Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ создаСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Exception с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора копирования класса Exception. (ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² области видимости throw являСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½ компилятором ΠΏΡ€ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.) ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ уничтоТаСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ осущСствлСн Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π΅Π³ΠΎ видимости ΠΈ выполняСтся Ρ‚Π΅Π»ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° catch.

Если, Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π² Ρ‚Π΅Π»Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° catch, Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ дальшС, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ throw Π±Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

throw;

Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ процСсс ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ стСка Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ подходящий ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. Π­Ρ‚ΠΎ позволяСт ΠΊΠ°ΠΆΠ΄ΠΎΠΉ области видимости ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ дСйствия ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ (ΠΈΠ»ΠΈ Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ) Ρ‚Π°ΠΊΠΈΡ… дСйствий.

Π’Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ прСдставляСт собой ускорСнный курс описания процСссов выбрасывания ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚Π΅ этой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 9.1. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Exception, содСрТащСС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ символьной строки ΠΈΠ»ΠΈ строку string, ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. Но Ρ‚Π°ΠΊΠΎΠΉ класс Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΌΠ°Π»ΠΎ Ρ‡Π΅ΠΌ отличаСтся ΠΎΡ‚ класса-ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ тСкстового сообщСния. БобствСнно говоря, Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π² качСствС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ просто строку string.

try {

 throw(string("Something went wrong!"));

} catch (string& s) {

 cout << "The exception was: " << s << endl;

}

НСльзя ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ даст Ρ…ΠΎΡ€ΠΎΡˆΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹; моя Ρ†Π΅Π»ΡŒ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ основноС свойство ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ: ΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой Ρ‚ΠΈΠΏ C++. Π’ качСствС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ int, char, class, struct ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ C++, Ссли Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ это потрСбуСтся. Но Π²Π°ΠΌ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, находящихся Π»ΠΈΠ±ΠΎ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Π»ΠΈΠ±ΠΎ Π²Π°ΡˆΠΈΡ… собствСнных.

Одно ΠΈΠ· самых Π±ΠΎΠ»ΡŒΡˆΠΈΡ… прСимущСств примСнСния ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это позволяСт Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚ΠΈΠΏΠ° самого класса ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π° Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠ΄Π° ошибки, тСкстовой строки, уровня ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΡΡ‚ΠΈ ошибки ΠΈΠ»ΠΈ Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ. ИмСнно Ρ‚Π°ΠΊ стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° опрСдСляСт стандартныС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <stdexcept>. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΌ классом ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² <stdexcept> являСтся exception, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ фактичСски опрСдСляСтся Π² <exception>. На рис. 9.1 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° иСрархия стандартных классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

Рис. 9.1. Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ стандартных классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

НазваниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ стандартного класса ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, для ΠΊΠ°ΠΊΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций ΠΎΠ½ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½. НапримСр, класс logic_error (логичСская ошибка) прСдставляСт ситуации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Ρ‹ΡΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ написании ΠΈΠ»ΠΈ Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈ Π΅Π³ΠΎ подклассы ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ситуации: Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ прСдусловия, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ индСкса, выходящСго Π·Π° допустимый Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, использованиС нСдопустимого Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Ρ‚.ΠΏ. Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ логичСской ошибки являСтся ошибка Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния, которая прСдставляСтся классом runtime_error. Она ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для ситуаций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ всСгда ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ выявлСны Π½Π° этапС кодирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°, ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ потСря значимости (underflow).

Π­Ρ‚ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций, ΠΈ, вСроятно, стандартныС классы ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈΠΌΠ΅ΡŽΡ‚ Π½Π΅ всС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. По-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡƒ, Π²Π°ΠΌ потрСбуСтся ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π±ΠΎΠ»Π΅Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ прилоТСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ database_error, network_error, painting_error ΠΈ Ρ‚.ΠΏ. ΠœΡ‹ обсудим это ΠΏΠΎΠ·ΠΆΠ΅. А Π΄ΠΎ этого Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ стандартныС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ стандартныС классы ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (допустим это), ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ классы ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡ… Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ ситуации, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСкс, выходящий Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Π° vector.

std::vector<int> v;

int i = -1;

// Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€ v...

try {

 i = v.at(v.size()); // Π’Ρ‹Ρ…ΠΎΠ΄ Π½Π° ΠΎΠ΄ΠΈΠ½ элСмСнт Π·Π° ΠΊΠΎΠ½Π΅Ρ† Π²Π΅ΠΊΡ‚ΠΎΡ€Π°

} catch (std::out_of_range& Π΅) {

 std::cerr << "Whoa, exception thrown: " << e.what() << '\n';

}

vector<>::at выбросит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ out_of_range, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ индСкс, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ мСньшС ΠΈΠ»ΠΈ большС, Ρ‡Π΅ΠΌ size() - 1. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Π°ΠΌ это извСстно, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для этой ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации. Если Π²Π°ΠΌ Π½Π΅ трСбуСтся ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π° вмСсто этого Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π»ΠΈ Π±Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс всСх ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

catch(std::exception& Π΅) {

 std::cerr << "Nonspecific exception: " << e.what() << '\n';

}

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ любой класс, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΉ ΠΎΡ‚ exception, what β€” это Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ функция-Ρ‡Π»Π΅Π½, которая Π²Ρ‹Π΄Π°Π΅Ρ‚ строку сообщСния, Π·Π°Π²ΠΈΡΡΡ‰ΡƒΡŽ ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π― ΠΏΠΎΡ‡Ρ‚ΠΈ вСрнулся Π² ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ. ЦСль ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 9.1, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сопровоТдаСтся ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ обсуТдСниСм, β€” ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ достоинств класса ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π”Π²Π΅ Π²Π΅Ρ‰ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ класс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ: иСрархия, ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΈΡ€ΠΎΠ΄Ρƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΈ сообщСниС, Π²Ρ‹Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΌ Π²Π°ΡˆΡƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ бСзопасный ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Π»Π΅Π³ΠΊΠΎ Π΅Π³ΠΎ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Ρ‚ΡŒ, Π° тСкст сообщСния ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Ρ‚Π΅ΠΌ ΠΆΠ΅ самым Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ прилоТСния осмыслСнноС сообщСниС ΠΎΠ± ошибкС.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ, ΠΈ бСзопасная ΠΈ эффСктивная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· самых Ρ‚Ρ€ΡƒΠ΄Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π² Ρ†Π΅Π»ΠΎΠΌ ΠΈ Π½Π° языкС C++ Π² частности. Каким Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ конструктор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ памяти, Ссли ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ выбрасываСтся Π² Π΅Π³ΠΎ Ρ‚Π΅Π»Π΅ ΠΈΠ»ΠΈ Π² спискС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ? Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ бСзопасноС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅? Π― ΠΎΡ‚Π²Π΅Ρ‡Ρƒ Π½Π° эти ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ вопросы Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π΅Ρ†Π΅ΠΏΡ‚Π°Ρ….

9.2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ бСзопасного ΠΏΡ€ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ… конструктора

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

Π’Π°Ρˆ конструктор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΈ строгиС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ бСзопасности ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π‘ΠΌ. обсуТдСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ слСдуСт Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Β«Π±Π°Π·ΠΎΠ²Ρ‹Ρ…Β» ΠΈ «строгих» Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ.

РСшСниС

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π² конструкторС Π±Π»ΠΎΠΊΠΈ try ΠΈ catch, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ дСйствия ΠΏΠΎ очисткС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ссли Π² Ρ…ΠΎΠ΄Π΅ конструирования выбрасываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ 9.2 приводятся простыС классы Device ΠΈ Broker. Broker создаСт Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Device Π² динамичСской памяти (heap), Π½ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΎΡ‚ этих ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ссли ΠΏΡ€ΠΈ конструировании выбрасываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 9.2. БСзопасный ΠΏΡ€ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ… конструктор