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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΏΡ€Π°Π²ΠΎΡ‡Π½ΠΎΠ΅ руководство ΠΏΠΎ C++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 31

Автор Π‘ΡŒΡΡ€Π½ Бтраустрап

R.15.2 Запуск особой ситуации

ΠŸΡ€ΠΈ запускС особой ситуации ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ. Запуск сопровоТдаСтся ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ опрСдСляСт, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ ΠΎΡΠΎΠ±ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ. Π’Π°ΠΊ, Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

throw "Help!";

ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ с Ρ‚ΠΈΠΏΠΎΠΌ char*:

try {

 //…

}

catch(const char* p) {

 // здСсь обрабатываСтся особая ситуация Π² ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… строках

}

Π° особая ситуация Overflow (ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅):

class Overflow {

 //…

public:

 Overflow(char,double,double);

};


void f(double x)

{

 //…

 throw Overflow('+',x,3.45e107);

}

ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ

try {

 //…

 f(1.2);

 //…

}

catch(Overflow& oo) {

 // здСсь ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° особой ситуации Ρ‚ΠΈΠΏΠ° Overflow

}

ΠŸΡ€ΠΈ запускС особой ситуации ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠ΅ΠΌΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°. "Π‘Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΠΉ" - это ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, провСряСмый-Π±Π»ΠΎΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ послСдним ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ½ΠΎ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ ΠΎΡ‚Ρ‚ΡƒΠ΄Π°. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ "ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ" Ρ‚ΠΈΠΏ опрСдСляСтся Π² Β§R.15.4.

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ выраТСния-запуска создаСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ статичСского Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слуТит ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠΌ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ throw, Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ°, описанной Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅. Если Π½Π΅ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° сопоставлСниС Ρ‚ΠΈΠΏΠΎΠ² (см. Β§R.15.4) ΠΈ использованиС Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ throw Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ (Β§R.5.2.2) ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρƒ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ return.

Если ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹, Π½Π΅ мСняя смысла ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π° счСт ΠΎΡ‚ΠΊΠ°Π·Π° ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² конструкторов ΠΈ дСструкторов для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Β§R.12.1), ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ совсСм Π±Π΅Π· Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‚ΠΎ ΠΎΡΠΎΠ±ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ нСпосрСдствСнно ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ выраТСния запуска.

Если Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ-запуска ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π½Π΅ Π·Π°Π΄Π°Π½, Ρ‚ΠΎ происходит пСрСзапуск ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ особой ситуации. Π’Π°ΠΊΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅-запуска ΠΌΠΎΠΆΠ΅Ρ‚ появится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² самом ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ ΠΈΠ»ΠΈ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая нСпосрСдствСнно ΠΈΠ»ΠΈ опосрСдованно вызываСтся ΠΈΠ· Π½Π΅Π³ΠΎ. НапримСр, Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ особой ситуации, Ссли нСльзя Π΅Ρ‰Π΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ провСсти эту ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

try {

 //…

}

catch (…) { // ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ всСх особых ситуаций

 // (частичная) ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° особых ситуаций

 throw; // ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… особых ситуаций Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ

}

R.15.3 ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ дСструкторы

Когда ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся ΠΈΠ· Ρ‚ΠΎΡ‡ΠΊΠΈ запуска особой ситуации ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ дСструкторы для всСх автоматичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², построСнных с ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π²Ρ…ΠΎΠ΄Π° Π² провСряСмый-Π±Π»ΠΎΠΊ.

Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π±Ρ‹Π» построСн ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚ΠΎ дСструкторы Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ построСнных Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π² Π½Π΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли особая ситуация запускаСтся Π² конструкторС ΠΏΡ€ΠΈ построСнии элСмСнта автоматичСского массива, Ρ‚ΠΎ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Ρ‚ΡŒΡΡ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΆΠ΅ построСнныС элСмСнты этого массива.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ Π²Ρ‹Π·ΠΎΠ²Π° дСструкторов для уничтоТСния автоматичСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², построСнных Π² Ρ…ΠΎΠ΄Π΅ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° провСряСмого-Π±Π»ΠΎΠΊΠ° Π΄ΠΎ выраТСния-запуска, называСтся "раскручиваниСм стСка".

R.15.4 ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° особой ситуации

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Ρ‚ΠΈΠΏΠ° T, const T, T& ΠΈΠ»ΠΈ const& сопоставим с Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ-запуска, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Ρ‚ΠΈΠΏΠ° E, Ссли:

[1] T ΠΈ E ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ;

[2] T являСтся доступным (Β§R.4.6) Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ классом E Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ запуска;

[3] T являСтся Ρ‚ΠΈΠΏΠΎΠΌ указатСля, Π° E являСтся Ρ‚Π°ΠΊΠΈΠΌ Ρ‚ΠΈΠΏΠΎΠΌ указатСля, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ запуска ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² T с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартных ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ указатСля (Β§R.4.6).

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

class Matherr {/*… */ virtual vf(); };

class Overflow: public Matherr {/*… */};

class Underflow: public Matherr {/*… */};

class Zerodivide: public Matherr {/*… */};


void f()

{

 try {

  g();

 }


 catch (Overflow oo) {

  //…

 }

 catch (Matherr mm) {

  //…

 }

}

Π—Π΄Π΅ΡΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Overflow Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ситуации Ρ‚ΠΈΠΏΠ° Overflow, Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Matherr Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ситуации Ρ‚ΠΈΠΏΠ° Matherr ΠΈ всСх Ρ‚ΠΈΠΏΠΎΠ², ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ Matherr, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Underflow ΠΈ Zerodivide.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π² провСряСмом-Π±Π»ΠΎΠΊΠ΅ ΠΏΠΎΠ΄Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ для Π΄Π°Π½Π½ΠΎΠΉ особой ситуации Π² порядкС ΠΈΡ… описания. БчитаСтся ошибкой, Ссли ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ располоТСнии ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса.

Эллипсис … Π² описании-особой-ситуации дСйствуСт Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ, ΠΈ Π² описании ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ сопоставим с любой особой ситуациСй. Если Π·Π°Π΄Π°Π½ эллипсис, Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ΄Ρ‚ΠΈ послСдним Π² провСряСмом-Π±Π»ΠΎΠΊΠ΅.

Если Π² провСряСмом-Π±Π»ΠΎΠΊΠ΅ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ сопоставлСния Π½ΠΈ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², поиск ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° продолТаСтся Π² динамичСски ΠΎΠ±ΡŠΠ΅ΠΌΠ»ΡŽΡ‰Π΅ΠΌ провСряСмом-Π±Π»ΠΎΠΊΠ΅. Если Π²ΠΎ всСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ сопоставлСния Π½ΠΈ с ΠΎΠ΄Π½ΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ, вызываСтся функция terminate() (Β§R.15.7).

Особая ситуация считаСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ послС Π²Ρ…ΠΎΠ΄Π° Π² Ρ‚Π΅Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ "раскручиваниС стСка".

R.15.5 Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ особых ситуаций

Π’ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ особой ситуации влияСт Π½Π° взаимодСйствиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Бписок особых ситуаций, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ прямо ΠΈΠ»ΠΈ косвСнно ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ данная функция, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ Π΅Π΅ описания. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ спСцификация-особой-ситуации ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎΠΏΠΈΡΠ°Ρ‚Π΅Π»ΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

спСцификация-особой-ситуации:

 throw ( список-Ρ‚ΠΈΠΏΠΎΠ² opt )

список-Ρ‚ΠΈΠΏΠΎΠ²:

 ΠΈΠΌΡ-Ρ‚ΠΈΠΏΠ°

 ΡΠΏΠΈΡΠΎΠΊ-Ρ‚ΠΈΠΏΠΎΠ² , имя-Ρ‚ΠΈΠΏΠ°

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

void f() throw (X,Y)

{

 //…

}

Если функция ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π΅ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π² спискС ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ unexpected(), см. Β§R.15.8.

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

Ѐункция, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ отсутствуСт спСцификация-особой-ситуации, ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΎΡΠΎΠ±ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ.

Ѐункция с пустой спСцификациСй-особых-ситуаций (throw()) Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… особых ситуаций.

Если функция ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡΠΎΠ±ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ класса X, Ρ‚ΠΎ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡΠΎΠ±ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ любого класса, ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ ΠΎΠ±Ρ‰ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌ классом ΠΎΡ‚ X.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ спСцификация-особой-ситуации Π½Π΅ относится ΠΊ Ρ‚ΠΈΠΏΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

R.15.6 Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ управлСния особыми ситуациями ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для Ρ€Π΅Π°ΠΊΡ†ΠΈΠΈ Π½Π° ошибки ΠΏΡ€ΠΈ самой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ особых ситуаций Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

terminate() ΠΈ unexpected().

R.15.6.1 Ѐункция terminate()

Иногда ΠΎΡ‚ прСдусмотрСнной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ особых ситуаций приходится ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ Π±ΠΎΠ»Π΅Π΅ Π³Ρ€ΡƒΠ±Ρ‹ΠΌ ΠΏΡ€ΠΈΠ΅ΠΌΠ°ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

- ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ управлСния особыми ситуациями Π½Π΅ смог Π½Π°ΠΉΡ‚ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ особой ситуации;

- ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ управлСния особыми ситуациями столкнулся с Π½Π°Ρ€ΡƒΡˆΠ΅Π½Π½ΠΎΠΉ структурой стСка;

- ΠΊΠΎΠ³Π΄Π° дСструктор, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹ΠΉ Π² процСссС раскрутки стСка ΠΏΡ€ΠΈ запускС особой ситуации, сам пытаСтся Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, запустив ΠΎΡΠΎΠ±ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ.

Π’ этих случаях вызываСтся функция

void terminate();

Она Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±Ρ‹Π»Π° ΡƒΠΊΠ°Π·Π°Π½Π° ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΈ послСднСм ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ set_terminate():

typedef void(*PFV)();

PFV set_terminate(PFV);

Ѐункция, которая Π±Ρ‹Π»Π° Π·Π°Π΄Π°Π½Π° Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ set_terminate(), Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ восстановлСния стСка. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ функция terminate() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ abort().

Π’Ρ‹Π±ΠΎΡ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ terminate() Ρ‚Π°ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая вмСсто Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, пытаСтся Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² Π²Ρ‹Π·Π²Π°Π²ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, являСтся ошибкой.

R.15.6.2 Ѐункция unexpected()

Если функция, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ-особой-ситуации, запускаСт Π½Π΅ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΎΡΠΎΠ±ΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Ρ‚ΠΎ вызываСтся функция

void unexpected();

Она Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±Ρ‹Π»Π° Π·Π°Π΄Π°Π½Π° ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΈ послСднСм ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ set_unexpected():

typedef void(*PFV)();

PFV set_unexpected(PFV);

Ѐункция, которая Π±Ρ‹Π»Π° Π·Π°Π΄Π°Π½Π° Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ set_unexpected(), Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ восстановлСния стСка. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ unexpected() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ terminate(). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ terminate() Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ abort(), Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ нСпосрСдствСнноС ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ошибки.