Байланысты: Бьерн Страуструп. Язык программирования С . М Бином, 2011
9.4.4 Особые ситуации и конструкторы Особые ситуации дают средство сигнализировать о происходящих в конструкторе ошибках. Поскольку
конструктор не возвращает такое значение, которое могла бы проверить вызывающая функция, есть
следующие обычные (т.е. не использующие особые ситуации) способы сигнализации:
[1] Возвратить объект в ненормальном состоянии в расчете, что пользователь проверит его
состояние.
[2] Установить значение нелокальной переменной, которое сигнализирует, что создать объект не
удалось.
Особые ситуации позволяют тот факт, что создать объект не удалось, передать из конструктора вовне:
Vector::Vector(int size)
{
if (sz<0 || max//
...
}
В функции, создающей вектора, можно перехватить ошибки, вызванные недопустимым размером
(Size()) и попытаться на них отреагировать:
Vector* f(int i)
{
Vector*
p;
try
{
p = new Vector v(i);
}
catch (Vector::Size) {
// реакция на недопустимый размер вектора
}
//
...
return
p;
}
Управляющая созданием вектора функция способна правильно отреагировать на ошибку. В самом
обработчике особой ситуации можно применить какой-нибудь из стандартных способов диагностики и
восстановления после ошибки. При каждом перехвате особой ситуации в управляющей функции может
быть свой взгляд на причину ошибки. Если с каждой особой ситуацией передаются описывающие ее
данные, то объем данных, которые нужно анализировать для каждой ошибки, растет. Основная задача
обработки ошибок в том, чтобы обеспечить надежный и удобный способ передачи данных от исходной
точки обнаружения ошибки до того места, где после нее возможно осмысленное восстановление.
Способ "запроса ресурсов путем инициализации" - самый надежное и красивое решение в том случае,
когда имеются конструкторы, требующие более одного ресурса. По сути он позволяет свести задачу
выделения нескольких ресурсов к повторно применяемому, более простому, способу, рассчитанному на
один ресурс.
Бьерн Страуструп.
Язык программирования С++
249
0>