Исключения в C ++ не должны быть перехвачены (без ошибок времени компиляции) вызывающей функцией. Таким образом, решение судьи о том, нужно ли ловить их с помощью try / catch (в отличие от Java).
Есть ли способ гарантировать, что сгенерированные исключения всегда перехватываются с помощью try / catch вызывающей функцией?
Нет.
Посмотрите прагматичный взгляд на спецификации исключений по причинам, почему нет.
Единственный способ, которым вы можете «помочь», - это документировать исключения, которые может выдать ваша функция, скажем, в виде комментария в заголовочном файле, объявляющего это. Это не применяется компилятором или чем-то еще. Используйте обзоры кода для этой цели.
Вы не должны использовать исключение здесь. Это, очевидно, не исключительный случай, если вам нужно ожидать его везде, где вы используете эту функцию!
Лучшим решением было бы заставить функцию возвращать экземпляр чего-то подобного. В отладочных сборках (при условии, что разработчики используют пути кода, которые они только что написали), они получат подтверждение, если они забудут проверить, была ли операция успешной или нет.
class SearchResult
{
private:
ResultType result_;
bool succeeded_;
bool succeessChecked_;
public:
SearchResult(Result& result, bool succeeded)
: result_(result)
, succeeded_(succeeded)
, successChecked_(false)
{
}
~SearchResult()
{
ASSERT(successChecked_);
}
ResultType& Result() { return result_; }
bool Succeeded() { successChecked_ = true; return succeeded_; }
}
Вне сферы вашего вопроса, поэтому я обсуждал не публиковать это, но в Java на самом деле есть 2 типа исключений, проверенных и непроверенных. Основное отличие состоит в том, что, как и в случае с c[++]
вами, вам не нужно ловить непроверенное исключение.
Для хорошей ссылки попробуйте это
Крис , вероятно, имеет лучший чистый ответ на вопрос:
Тем не менее, мне любопытно о корне вопроса. Если пользователь должен всегда заключать вызов в блок try / catch, должна ли вызываемая пользователем функция действительно генерировать исключения в первую очередь?
Это трудный вопрос, на который нужно ответить без дополнительного контекста в отношении рассматриваемой кодовой базы. Снимаясь с бедра, я думаю, что лучший ответ здесь состоит в том, чтобы обернуть функцию так, чтобы рекомендуемый (если не только, в зависимости от общего стиля исключения кода) публичный интерфейс делал попытку / ловлю для пользователя. Если вы просто пытаетесь убедиться, что в вашем коде нет необработанных исключений, лучше всего подойдут модульные тесты и проверка кода.
Есть ли способ гарантировать, что сгенерированные исключения всегда перехватываются с помощью try / catch вызывающей функцией?
Я нахожу довольно забавным, что толпа Java - включая меня - пытается избежать проверенных Исключений. Они пытаются обойти себя, заставляя перехватывать исключения с помощью RuntimeExceptions .
Однажды была попытка добавить спецификации динамических исключений к сигнатуре функции, но поскольку язык не мог обеспечить их точность, они впоследствии были обесценены.
В C ++ 11 и более поздних версиях у нас теперь есть спецификатор noexcept .
Опять же, если подпись помечена, чтобы выбросить, все еще нет требования, чтобы она была обработана вызывающей стороной.
В зависимости от контекста вы можете обеспечить исключительное поведение, кодируя его в систему типов.
Смотрите: std :: необязательный как часть основ библиотеки.
Или вы можете начать бросать критические исключения. Конечно, исключение нарушения прав доступа будет поймать внимание ваших пользователей.