Фундаментальный базовый принцип C ++ заключается в том, что объект полностью создается только после возврата конструктора объекта. Когда выполнение входит в конструктор класса, сам класс создается , а не . Только его члены класса (и любые базовые классы тоже). Только когда возвращается конструктор, только затем объект полностью построен, и у вас есть полностью готовый объект, с которым можно поиграть.
Следовательно, выдается исключение в конструктор означает, что объект был , а не . Полная остановка. Конец истории. Это все что она написала. Нет исключений из этого правила (каламбур).
Теперь, что это значит, когда вы ловите исключение, которое выдается из конструктора базового класса? Ну, вы можете это сделать, но это не меняет того факта, что возникло исключение, а базовый класс не был создан. Это означает, что производный класс не может быть создан . Нельзя ожидать, что выполнение достигнет конца обработчика исключений, а затем вернется к родителю, как если бы класс был полностью создан без ошибок.
Этого не произойдет. Вы не можете каким-то образом получить базовый класс, который не создается, а производный класс создается. C ++ не работает таким образом.
Когда вы перехватываете исключение из базового класса, у вас есть только две опции:
1) Ваш обработчик исключений может перебрасывать свое собственное исключение после того, как он делает что угодно он хочет это сделать.
2) В противном случае C ++ перезапустит исключение для вас, если обработчик исключений вернется, не выдав свое собственное исключение.