Язык программирования C++ для профессионалов



         

Неожиданные особые ситуации - часть 2


void networked_g() { STC xx(&rethrow); // теперь unexpected() вызывает rethrow() g(); }

В предыдущем разделе было показано, что unexpected() потенциально вызывается из обработчика catch (...). Значит в нашем случае обязательно произойдет повторный запуск особой ситуации. Повторный запуск, когда особая ситуация не запускалась, приводит к вызову terminate(). Поскольку обработчик catch (...) находится вне той области видимости, в которой была запущена сетевая особая ситуация, бесконечный цикл возникнуть не может.

Есть еще одно, довольно опасное, решение, когда на неожиданную особую ситуацию просто "закрывают глаза":

void muddle_on() { cerr << "не замечаем особой ситуации\n"; } // ... STC xx(&muddle_on); // теперь действие unexpected() сводится // просто к печати сообщения

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

Возможно другое решение, когда вызов unexpected() преобразуется в запуск особой ситуации Fail (неудача):

void fail() { throw Fail; } // ... STC yy(&fail);

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




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