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

голоса
21

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

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

Задан 04/08/2008 в 11:01
источник пользователем
На других языках...                            


7 ответов

голоса
22

Нет.

См прагматичный взгляд на Exception Технические причины , почему нет.

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

Ответил 04/08/2008 в 11:10
источник пользователем

голоса
9

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

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

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_; }
}
Ответил 24/09/2008 в 10:24
источник пользователем

голоса
4

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

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

Ответил 04/08/2008 в 18:51
источник пользователем

голоса
2

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

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

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

Ответил 05/08/2008 в 05:56
источник пользователем

голоса
0

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

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


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

См: станд :: опциональный как часть основы библиотеки.

Ответил 08/05/2016 в 15:07
источник пользователем

голоса
0

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

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

Ответил 04/08/2008 в 19:14
источник пользователем

голоса
0

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

Ответил 04/08/2008 в 18:33
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more