Исключение в конструкторе означает, что произошло что-то действительно плохое, и, поскольку конструкторы не могут вернуть (недопустимое) значение, указывающее на сбой в правильной конструкции объекта, есть 3 варианта: инициализировать объект в каком-то особом состоянии в надежде что где-то еще в коде вызывающего абонента он будет проверяться и обрабатываться должным образом, или для установки внешней переменной / флага, чтобы отметить сбой инициализации, или для создания исключения после освобождения любой памяти, которую он динамически выделяет. Как правило, если исключение генерируется до того, как объект полностью построен, деструкторы будут вызываться для любых объектов-членов, которые были созданы на данный момент. И если массив объектов был частично построен при возникновении исключения, будут вызываться только деструкторы для созданных объектов массива. Кроме того, деструкторы вызываются для каждого автоматического c объекта, созданного в блоке try, прежде чем будет обнаружено исключение, возникшее в этом блоке.