Обеспечение постоянного перехвата исключений
Исключения в C++ не нужно перехватывать (нет ошибок времени компиляции) вызывающей функцией. Таким образом, разработчик должен решать, ловить ли их с помощью try / catch (в отличие от Java).
Есть ли способ гарантировать, что генерируемые исключения всегда перехватываются с помощью try / catch вызывающей функцией?
Ответов (7)7
Нет.
См. «Прагматичный взгляд на спецификации исключений», чтобы узнать, почему нет.
Единственный способ «помочь» в этом - это задокументировать исключения, которые может выдать ваша функция, например, в виде комментария в файле заголовка, объявляющем об этом. Это не выполняется компилятором или чем-то еще. Для этого используйте обзоры кода.
Однажды была попытка добавить спецификации динамических исключений к сигнатуре функции, но, поскольку язык не мог обеспечить их точность, позже они были обесценены.
В C++ 11 и последующих версиях у нас теперь есть спецификатор noexcept .
Опять же, если подпись помечена как отбрасываемая, все еще не требуется, чтобы она обрабатывалась вызывающим абонентом.
В зависимости от контекста вы можете гарантировать обработку исключительного поведения, закодировав его в системе типов.
Смотрите: std::optional как часть основ библиотеки.
У Криса , вероятно, есть лучший чистый ответ на вопрос:
Однако меня интересует корень вопроса. Если пользователь должен всегда заключать вызов в блок try / catch, должна ли вызываемая пользователем функция в первую очередь генерировать исключения?
На этот вопрос сложно ответить без дополнительного контекста, касающегося рассматриваемой кодовой базы. Стрельба от бедра, я думаю, что лучший ответ здесь - обернуть функцию так, чтобы рекомендуемый (если не только, в зависимости от общего стиля исключения кода) открытый интерфейс выполнял попытку / уловить для пользователя. Если вы просто пытаетесь убедиться, что в вашем коде нет необработанных исключений, модульные тесты и проверка кода, вероятно, являются лучшим решением.
За пределами вашего вопроса, поэтому я обсуждал, не публиковать это, но в Java на самом деле есть 2 типа исключений: отмеченные и непроверенные. Основное отличие состоит в том, что, как и в c[++]
предыдущей версии, вам не нужно перехватывать непроверенное исключение.
Для хорошей справки попробуйте это
Есть ли способ гарантировать, что генерируемые исключения всегда перехватываются с помощью try / catch вызывающей функцией?
Мне кажется довольно забавным, что люди, занимающиеся Java, включая меня, стараются избегать отмеченных исключений. Они пытаются обойтись без перехвата исключений с помощью RuntimeExceptions .
Вы не должны использовать здесь исключение. Очевидно, что это не исключительный случай, если вам нужно ожидать этого везде, где вы используете эту функцию!
Лучшим решением было бы заставить функцию возвращать экземпляр чего-то вроде этого. В отладочных сборках (при условии, что разработчики используют только что написанные пути кода) они получат подтверждение, если забудут проверить, успешно ли завершилась операция.
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_; }
}