Бьерн Страуструп - Язык программирования С++. Главы 9-10
Страница 13. Особые ситуации и конструкторы



9.4.4 Особые ситуации и конструкторы

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

         Vector::Vector(int size)
         {
            if (sz<0 || max<sz) throw Size();
            // ...
         }

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

         Vector* f(int i)
         {
           Vector* p;
           try {
             p = new Vector v(i);
           }
           catch (Vector::Size) {
             // реакция на недопустимый размер вектора
           }
           // ...
           return p;
         }

    Управляющая созданием вектора функция способна правильно
 отреагировать на ошибку. В самом обработчике особой ситуации можно
 применить какой-нибудь из стандартных способов диагностики и
 восстановления после ошибки. При каждом перехвате особой ситуации
 в управляющей функции может быть свой взгляд на причину ошибки. Если
 с каждой особой ситуацией передаются описывающие ее данные, то объем
 данных, которые нужно анализировать для каждой ошибки, растет. Основная
 задача обработки ошибок в том, чтобы обеспечить надежный и удобный
 способ передачи данных от исходной точки обнаружения ошибки до того
 места, где после нее возможно осмысленное восстановление.
     Способ "запроса ресурсов путем инициализации" - самый надежное
 и красивое решение в том случае, когда имеются конструкторы, требующие
 более одного ресурса. По сути он позволяет свести задачу выделения
 нескольких ресурсов к повторно применяемому, более простому, способу,
 рассчитанному на один ресурс.

 
« Предыдущая статья   Следующая статья »