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

StackOverflow https://stackoverflow.com/questions/1104

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Нет.

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

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

Другие советы

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

Лучшим решением было бы заставить функцию возвращать экземпляр чего-то подобного этому.В отладочных сборках (при условии, что разработчики используют пути к коду, которые они только что написали) они получат 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_; }
}

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

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

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

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

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

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

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

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

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


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

Видишь: std:: необязательно как часть основ библиотечного дела.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top