Чтобы ответить на ваш вопрос, это не смехотворная идея, и вы можете использовать std::exception
для регулярной обработки ошибок; с некоторыми оговорками.
Использование std::exception
в качестве результата функции
Допустим, что функция может выйти в несколько ошибочных состояний:
std::exception f(int i)
{
if (i > 10)
return std::out_of_range("Index is out of range");
if (can_do_f())
return unexpected_operation("Can't do f in the current state");
return do_the_job();
}
Как вы можете справиться с этим с std::exception
или опциональным? Когда функция вернется, будет создана копия исключения, содержащая только часть std::exception
и отклоняющую специфику фактической ошибки; оставив вам единственную информацию, которая «да, что-то пошло не так ...». Поведение будет таким же, как возврат логического или необязательного ожидаемого типа результата, если таковой имеется.
Использование std::exception_ptr
сохранить специфику
Другим решением было бы применить тот же подход, чем в std::promise, то есть вернуть std::exception_ptr
. Там вы сможете возвращать либо ничего, либо исключение, сохраняя при этом фактические данные об ошибках. Восстановление фактического типа ошибки может быть сложным.
Возвратившись ошибку или результат в том же самом объекте
Наконец другой вариант будет использовать Expected<T>
proposal и its implementation. Там вы сможете вернуть значение или ошибку в одном объекте и обработать эту ошибку, если хотите (путем проверки ошибки или с регулярной обработкой исключений), с некоторыми особенностями для функции, не возвращающей значения (подробнее на Stack Overflow или по телефону this blog).
Как выбрать
Мое личное мнение по этому вопросу, что, если вы собираетесь использовать исключения, а затем использовать их так, как они были разработаны, в конечном итоге с некоторыми дополнительными инструментами, как Expected<T>
, чтобы облегчить , В противном случае, если вы не можете использовать стандартную обработку исключений, тогда перейдите к решению, которое зарекомендовало себя, как классическая система кодов ошибок.
@vsoftco: См. Редактирование. Я говорю об обработке ошибок исключения исключений. – einpoklum
Интересно ... Недавно я слышал, что Google, похоже, использует такую систему, не уверен, правда или нет. Что делать, если ваши функции должны что-то вернуть? Будете ли вы использовать пару/кортеж? – vsoftco
@vsoftco: Давайте не будем вдаваться в подробности ... вопрос в том, что использовать для сообщения об ошибках. Но - либо функция будет иметь параметр ввода/вывода (ссылка или указатель), либо, может быть, она вернет некоторый класс case (я уверен, что на C++ сейчас что-то вроде этого лучше, чем C-союзы). – einpoklum