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

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


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

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

}

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

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



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