Язык программирования C++ от Страуструпа


         

к запуску особой ситуации, который,


     // ...

     m.debug_print();

  }

}

Здесь последнее обращение к add приведет к запуску особой ситуации, который, в свою очередь, приведет к вызову Int_overflow::debug_print().Если бы особая ситуация передавалась по значению, а не по ссылке, то была бы вызвана функция Matherr::debug_print().

Нередко бывает так, что перехватив особую ситуацию, обработчик решает, что с этой ошибкой он ничего не сможет поделать. В таком случае самое естественное запустить особую ситуацию  снова в надежде, что с ней сумеет разобраться другой обработчик:

void h()

{

  try {

     // какие-то операторы

  }

  catch (Matherr) {

     if (can_handle_it) {           // если обработка возможна,

       // сделать ее

     }

     else {

       throw;                      // повторный запуск перехваченной

       // особой ситуации

     }

  }

}

Повторный запуск записывается как оператор throw без параметров. При этом снова запускается исходная особая ситуация, которая была перехвачена, а не та ее часть, на которую рассчитан обработчик Matherr. Иными словами, если была запущена Int_overflow, вызывающая h() функция могла бы перехватить ее как Int_overflow, несмотря на то, что она была перехвачена в h() как Matherr и запущена снова:

void k()

{

  try {

     h();

     // ...

  }

  catch (Int_overflow) {

     // ...

  }

}

Полезен вырожденный случай перезапуска. Как и для функций, эллипсис ... для обработчика означает "любой параметр", поэтому  оператор catch (...) означает перехват любой особой ситуации:

void m()

{

  try {

     // какие-то операторы

  }

  catch (...) {

     // привести все в порядок

     throw;

  }

}

Этот пример надо понимать так: если при выполнении основной части m() возникает особая ситуация, выполняется обработчик, которые выполняет общие действия по устранению последствий особой ситуации, после этих действий особая ситуация, вызвавшая их, запускается повторно.

Поскольку обработчик может перехватить производные особые ситуации нескольких типов, порядок, в котором идут обработчики в проверяемом блоке, существенен. Обработчики пытаются перехватить особую ситуацию в порядке их описания. Приведем пример:


Содержание  Назад  Вперед