исключения зло, лучше их без сильной необходимости не использовать
Не скажи, делать еррор код ретурн, ориентироваться по зарезервированным выходным данным или передавать аргументами указатели на структуру с описанием ошибки дикий гемор
Мне нравится подход Раста с Result В плюсах есть аналоги, и в целом выглядят вполне плюсовенько. Но пока приходилось использовать максимум std::optional