Стоит ли выбрасывать исключение из конструктора?



По этому вопросу сообщество разработчиков буквально разделилось на два лагеря, «за» и «против», соответственно.

Действительно, это палка о двух концах, давайте разберёмся.



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

Однако, если что-то пошло не так, то экземпляр типа просто не допускается к существованию.

Предотвратить можно только за

счёт исключения.



С другой стороны, есть практика двухэтапного создания объекта. Сначала готовим данные и проверяем их, затем выделяем память. Подготовку данных можно вынести в отдельный слой, например, валидации.

Или некий фабричный метод. Тогда, вид ошибки (исключение, монада, контейнер) будет зависеть от потребностей в конкретный момент времени.



Обе практики имеют место быть, и между ними можно даже найти баланс. Например, ThrowIfNull вызовы.

Но чего уж точно не должно быть в конструкторе - сложной логики.

Только элементарная инициализация.