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

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

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

4.08.2008 10:01:37
Консенсус относительно прокрустового подхода Java к спецификациям исключений заключается в том, что он сильно нарушен.
Pete Becker 13.02.2013 13:42:55
7 ОТВЕТОВ
РЕШЕНИЕ

Нет.

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

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

25
7.02.2013 13:07:37

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

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

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_; }
}
9
7.02.2016 00:42:29
+1 к этому. Если вы ожидаете какой-либо результат, он не должен возвращаться в виде исключения.
macbirdie 24.09.2008 12:55:58
GCC, по крайней мере, имеет атрибут функции, требующий обработки возвращаемого значения. Менее грязный, чем этот дополнительный бул.
Zan Lynx 26.03.2009 01:38:59
Покажите мне пример человека, который не шарлатан или хакер, который говорит, что исключения только для исключительных ситуаций.
John Dibling 25.01.2011 13:25:44
@JohnDibling Я много слышал от других разработчиков Java, но мне еще не приходилось слышать / видеть эти точные слова из любых книг, ссылок или известных разработчиков. Если так, то создатель (и) Python не получили памятку :)
Jason Mock 14.11.2011 17:56:32
@JohnDibling Покажите мне кого-то, кто серьезно, кто не говорит это.
James Kanze 23.07.2013 08:37:15

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

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

3
7.02.2013 13:08:40

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

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

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

2
23.05.2017 10:31:25

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

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

0
4.08.2008 18:14:20

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

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


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

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

0
8.05.2016 21:06:42

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

-1
4.08.2008 17:33:57
Что, прайтел, является «критическим» исключением?
John Dibling 25.01.2011 13:27:47
Если бы вы читали после периода, вы могли бы заметить, что я явно упомянул один.
Ryan Fox 25.01.2011 23:20:31