Обеспечение того, чтобы исключения всегда фиксировались - PullRequest
23 голосов
/ 04 августа 2008

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

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

Ответы [ 7 ]

23 голосов
/ 04 августа 2008

номер

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

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

9 голосов
/ 24 сентября 2008

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

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

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 голосов
/ 04 августа 2008

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

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

2 голосов
/ 05 августа 2008

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

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

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

0 голосов
/ 08 мая 2016

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

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


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

См .: std :: необязательно как часть основ библиотеки.

0 голосов
/ 04 августа 2008

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

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

0 голосов
/ 04 августа 2008

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

...