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

d51f8a0c

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

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

  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; }

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

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



Содержание раздела