1) Является ли использование исключений единственным решением для этого?
Нет.Вы также можете записать состояние ошибки в конструкторе и иметь метод, который его возвращает.Или вы можете сделать двухфазное построение, когда конструктор выполняет только те части, которые не могут выйти из строя, и вы вызываете вторую функцию инициализации, чтобы завершить ее.
Я думаю, что исключения будут предпочтительным методом.Если вы делаете вещи, которые могут нуждаться в некоторой очистке в случае сбоя конструктора, делайте это с локальными переменными и в конце копируйте результаты в переменные-члены.
Если main () является ближайшим стеком(это хорошо написано?) туда, где запускаются исключения,
2) Это неправильно, если я ловлю исключения в main?
Совершенно ничего плохого в перехвате исключений в main.На самом деле, лучше всего ловить исключения на самом внешнем уровне, которые могут что-либо сделать с ошибкой;часто это означает, что нужно показать ошибку и закрыть программу, а main - идеальное место.