Обеспечение постоянного перехвата исключений

Исключения в C++ не нужно перехватывать (нет ошибок времени компиляции) вызывающей функцией. Таким образом, разработчик должен решать, ловить ли их с помощью try / catch (в отличие от Java).

Есть ли способ гарантировать, что генерируемые исключения всегда перехватываются с помощью try / catch вызывающей функцией?

Ответов (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_; }
}