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




класс exception c++ (5)

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

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

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

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


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


Нет.

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

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


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

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

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

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

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

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





try-catch