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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 68

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° вСрнСмся ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π° 1.5.2, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Sales_item. Она провСряСт, относятся Π»ΠΈ ΠΎΠ±Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Π΅ записи ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³Π΅. Если Π½Π΅Ρ‚, ΠΎΠ½Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Sales_item item1, item2;

cin >> item1 >> item2;

// сначала ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ item1 ΠΈ item2

// ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΊΠ½ΠΈΠ³Ρƒ

if (item1.isbn() == item2.isbn()) {

 cout << item1 + item2 << endl;

 return 0; // ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ успСха

} else {

 cerr << "Data must refer to same ISBN"

      << endl;

 return -1; // ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΠΎΡ‚ΠΊΠ°Π·Π°

}

Π’ Π±ΠΎΠ»Π΅Π΅ рСалистичной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»Π΅Π½Π° ΠΎΡ‚ части, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ взаимодСйствиС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π° Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π»Π° ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΠΎΡ‚ΠΊΠ°Π·Π°.

// сначала ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ item1 ΠΈ item2

// ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΊΠ½ΠΈΠ³Ρƒ

if (item1.isbn() != item2.isbn())

 throw runtime_error("Data must refer to same ISBN");

// Ссли ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ здСсь, Π·Π½Π°Ρ‡ΠΈΡ‚, ISBN ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚

cout << item1 + item2 << endl;

Если Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ISBN окаТутся Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠ° runtime_error. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, способному ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с этой ошибкой.

Π’ΠΈΠΏ runtime_error являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ‚ΠΈΠΏΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ stdexcept стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π‘ΠΎΠ»Π΅Π΅ подробная информация ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 5.6.3. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ класса runtime_error слСдуСт ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ класса string ΠΈΠ»ΠΈ символьной строкой Π² стилС Π‘ (см. Ρ€Π°Π·Π΄Π΅Π» 3.5.4). Π­Ρ‚Π° строка прСдставляСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅.

5.6.2. Π‘Π»ΠΎΠΊ try

Π‘Π»ΠΎΠΊ try ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ синтаксис:

try {

 ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹_ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

} catch (объявлСниС_ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ) {

 ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹_ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

} catch (объявлСниС_ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ) {

 ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹_ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

} // ...

Π‘Π»ΠΎΠΊ try начинаСтся с ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова try, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄Π°, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΉ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки.

Π‘Π»ΠΎΠΊ try сопровоТдаСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ»ΠΈ нСсколькими Π±Π»ΠΎΠΊΠ°ΠΌΠΈ catch. Π‘Π»ΠΎΠΊ catch состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… частСй: ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова catch, объявлСния (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, бСзымянного) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобках (называСтся объявлСниСм ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (exception declaration)) ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°. Когда объявлСниС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Π±Π»ΠΎΠΊΠ΅ catch совпадаСт с ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, выполняСтся связанный с Π½ΠΈΠΌ Π±Π»ΠΎΠΊ. По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ выполнСния ΠΊΠΎΠ΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ нСпосрСдствСнно послС Π½Π΅Π³ΠΎ.

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹_ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Π±Π»ΠΎΠΊΠ΅ try ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π΅Π΅ Π»ΠΎΠ³ΠΈΠΊΡƒ. Подобно Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π±Π»ΠΎΠΊΠ°ΠΌ ΠΊΠΎΠ΄Π°, Π±Π»ΠΎΠΊΠΈ try способны ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ языка Π‘++, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ объявлСния. ΠžΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π±Π»ΠΎΠΊΠ΅ try ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ нСдоступны Π²Π½Π΅ Π±Π»ΠΎΠΊΠ°, Π² частности, ΠΎΠ½ΠΈ Π½Π΅ доступны Π² Π±Π»ΠΎΠΊΠ°Ρ… catch.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ суммирования Π΄Π²ΡƒΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса Sales_item, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠ½ΠΈΠ³ΠΈ, использовался ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ throw. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса Sales_item Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚Π΄Π΅Π»Π΅Π½Π° ΠΎΡ‚ части, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² Π±Π»ΠΎΠΊΠ΅ слоТСния.

while (cin >> item1 >> item2) {

 try {

  // ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ складываСт Π΄Π²Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Sales_item

  // Ссли ΠΏΡ€ΠΈ слоТСнии ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ сбой, ΠΊΠΎΠ΄ пСрСдаст

  // ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ runtime_error

 } catch (runtime_error err) {

  // Π½Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Ρ‡Ρ‚ΠΎ ISBN слагаСмых ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

  // Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ

  cout << err.what()

       << "\nTry Again? Enter y or n" << endl;

  char c;

  cin >> с;

  if (!cin || с == 'n')

   break; // Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° while

 }

}

Π’ Π±Π»ΠΎΠΊΠ΅ try располоТСна обычная Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ сдСлано ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ данная Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ способна ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° runtime_error.

Π”Π°Π½Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ try ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΈΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ catch, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° runtime_error. ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² Π±Π»ΠΎΠΊΠ΅ послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова catch ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ дСйствия, выполняСмыС Π² случаС, Ссли ΠΊΠΎΠ΄ Π² Π±Π»ΠΎΠΊΠ΅ try пСрСдаст ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ runtime_error. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ сообщСния ΠΎΠ± ошибкС ΠΈ запрос Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ символ 'n', Ρ†ΠΈΠΊΠ» while Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½ продолТаСтся ΠΈ считываСт Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Sales_item.

Π’ сообщСнии ΠΎΠ± ошибкС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ тСкст, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ err.what(). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ извСстно, Ρ‡Ρ‚ΠΎ классом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ err являСтся runtime_error, Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ функция what() являСтся Ρ‡Π»Π΅Π½ΠΎΠΌ (см. Ρ€Π°Π·Π΄Π΅Π» 1.5.2) класса runtime_error. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… классов ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° функция-Ρ‡Π»Π΅Π½ what(), которая Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΡƒΡŽ строку Π² стилС Π‘ (Ρ‚.Π΅. const char*). Π’ случаС класса runtime_error эта строка являСтся ΠΊΠΎΠΏΠΈΠ΅ΠΉ строки, использованной ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса runtime_error. Если описанный Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΊΠΎΠ΄ пСрСдаст ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠΌ catch сообщСниС ΠΎΠ± ошибкС Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

Data must refer to same ISBN

Try Again? Enter y or n

ΠŸΡ€ΠΈ поискС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ прСрываСтся

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

Поиск ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° осущСствляСтся ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΉ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. Π‘Π½Π°Ρ‡Π°Π»Π° поиск ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ осущСствляСтся Π² Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ. Если ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° catch Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Π° поиск продолТаСтся Π² Ρ‚ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π²Ρ‹Π·Π²Π°Π»Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Если ΠΈ здСсь ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π» catch Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, эта функция Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, Π° поиск продолТаСтся ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² дальшС, ΠΏΠΎΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½.

Если ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π» catch Ρ‚Π°ΠΊ ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΉΠ΄Π΅Π½, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ terminate(), которая ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ exception. ПовСдСниС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ зависит ΠΎΡ‚ систСмы, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½Π° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Π±Π»ΠΎΠΊΠΎΠ² try, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ: Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², Π±Π΅Π· Π±Π»ΠΎΠΊΠΎΠ² try Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈ Π½ΠΈ для ΠΊΠ°ΠΊΠΈΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ terminate(), которая (ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ) ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! НаписаниС устойчивого ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ ΠΊΠΎΠ΄Π° β€” довольно слоТная Π·Π°Π΄Π°Ρ‡Π°

Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°ΡŽΡ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ мСстС, Π³Π΄Π΅ происходит ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· дСйствий, ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ стороной, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹, Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π½Π΅Ρ‚. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, пропуск части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ останСтся Π² нСдопустимом ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠΌ состоянии, Π»ΠΈΠ±ΠΎ Ρ‡Ρ‚ΠΎ рСсурс Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ освобоТдСн ΠΈ Ρ‚.Π΄. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ "Π·Π°Ρ‡ΠΈΡ‰Π°ΡŽΡ‚" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π²ΠΎ врСмя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ устойчивыми ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ (exception safe). НаписаниС устойчивого ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ ΠΊΠΎΠ΄Π° Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ слоТно ΠΈ практичСски Π½Π΅ рассматриваСтся Π² Π΄Π°Π½Π½ΠΎΠΌ Π²Π²ΠΎΠ΄Π½ΠΎΠΌ курсС.

НСкоторыС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ просто для Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² случаС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ заботятся ΠΎΠ± устойчивости ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ.

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

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