Подтвердить что ты не робот

Обеспечение того, чтобы Исключения всегда были удалены

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

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

4b9b3361

Ответ 1

Нет.

См. Прагматичный взгляд на спецификации исключения по причинам, почему нет.

Единственный способ, которым вы можете "помочь", это документировать исключения, которые может использовать ваша функция, например комментарий в файле заголовка, объявляющий его. Это не выполняется компилятором или чем-то еще. Используйте коды для этой цели.

Ответ 2

Здесь вы не должны использовать исключение. Это, очевидно, не является исключительным случаем, если вам нужно ожидать его везде, где вы используете эту функцию!

Лучшим решением было бы заставить функцию вернуть экземпляр чего-то подобного. В отладочных сборках (предполагая, что разработчики используют коды кода, которые они только что написали), они получат подтверждение, если они забудут проверить, была ли операция выполнена или нет.

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_; }
}

Ответ 3

Вне области вашего вопроса, поэтому я обсуждал это, но не на Java, на самом деле существует 2 типа исключений, проверенных и непроверенных. Основное отличие состоит в том, что, как и в c[++], вам не нужно улавливать неконтролируемое исключение.

Для хорошей справки попробуйте это

Ответ 4

Крис, вероятно, имеет лучший чистый ответ на вопрос:

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

Это сложный вопрос для ответа без дополнительного контекста относительно рассматриваемой кодовой базы. Стрельба из бедра, я думаю, лучший ответ здесь заключается в том, чтобы обернуть функцию таким образом, чтобы рекомендованный (если не только, в зависимости от общего стиля исключения код) открытый интерфейс выполняет попытку/улов для пользователя. Если вы просто пытаетесь обеспечить отсутствие необработанных исключений в вашем коде, модульные тесты и обзор кода, вероятно, являются лучшим решением.

Ответ 5

Или вы можете начать бросать критические исключения. Разумеется, исключение нарушения доступа привлечет внимание ваших пользователей.

Ответ 6

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

Мне кажется довольно забавным, что толпа Java - включая меня - пытается избежать проверочных Исключений. Они стараются изо всех сил пытаться поймать Исключения, используя RuntimeExceptions.

Ответ 7

Когда-то была попытка добавить спецификации динамических исключений к сигнатуре функции, но поскольку язык не смог обеспечить их точность, они были позже амортизируется.

В С++ 11 и forward мы теперь имеем noexcept specifier.
Опять же, если подпись помечена для броска, все равно не требуется повторение того, что ее обрабатывает вызывающий.


В зависимости от контекста вы можете гарантировать, что исключительное поведение должно выполняться путем его кодирования в систему типов.

См. std:: optional как часть основных принципов библиотеки.