Исключение в конструкторе С++

192
07 июля 2018, 15:40

хотел поинтересоваться, считается ли плохим тоном бросать исключение в конструкторе? Я знаю, что объект не будет полностью создан, и из-за этого возможны утечки. Но в моем случае, я использую умные указатели и мне нужно при создании объекта системы проверить его получаемые данные в конструкторе, если что-то не правильно то бросить исключение и уже там сделать exit(), либо может делать exit прямо в конструкторе? Хотелось бы получить подробный ответ на эту тему. За ранее спасибо...

Answer 1

считается ли плохим тоном бросать исключение в конструкторе?

Нет, не считается. Исключения в том числе для того и предназначены, чтобы предоставить механизм аварийного выхода из тех контекстов, в которых других более-менее элегантных механизмов обработки исключительных ситуаций предложить не получается. Конструкторы как раз относятся к этой категории (операторы - другой пример). Разумеется, бросать исключения надо уметь правильно, чтобы не было никаких утечек.

Однако принятие решения о том, выбросить ли из конструктора исключение или все таки завершить конструирование объекта в некоем "подвешенном" состоянии - вопрос творческий и неоднозначный.

если что-то не правильно то бросить исключение и уже там сделать exit(), либо может делать exit прямо в конструкторе

У вас какая-то безусловная завязанность на exit наблюдается. Бросание и обработка исключений совсем не предполагает обязательного завершения программы. Исключение можно поймать, обработать, восстановиться после него и продолжить нормальную работу.

Но если в вашем случае возникновение исключительной ситуации обязательно приводит к завершению работы всей программы, то зашивать безусловное убивание всей программы в конструктор какого-то объекта - в большинстве случаев дурной тон. Лучше все таки просто выбросить исключение, а решение о завершении принять на более высоком уровне.

READ ALSO
Преобразование String в double

Преобразование String в double

Как мне преобразовать числа string в double через atof сразу в массив?

153
Абстрактный класс и его наследники

Абстрактный класс и его наследники

Знаю, что если есть абстрактный клас(например: Account) и наследники абстрактного класа(PrivelegeAccount, SavingAccount), то можно через указатель на родительский...

159
Как запустить программу в visual studio code?

Как запустить программу в visual studio code?

Выскакивает вот такая ошибка, когда нажимаю Отладка -> Запустить без отладки Как решить эту проблему?

261
segmentation fault при очистке выделенной памяти

segmentation fault при очистке выделенной памяти

Что я делаю не так ? Программа грубо говорят пишет в компорт пакет и читает ответПример кода:

179