Используется ли для С++ броска?

Я начал использовать исключения С++ единообразно, и теперь мне хотелось бы, чтобы компилятор (g++) проверял, нет ли утечек исключений. Декорация throw должна делать это, например, const для констант методов класса.

Ну, это не так.

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

Можно ли как-то убедить g++ быть более строгим в его проверке на бросок, т.е. действительно удостовериться, что функция, украшенная как throw(), никогда никогда не выбросит что-либо.

Изменить: Нашел этот вопрос, рассматривая этот вопрос широко.

Ответы

Ответ 1

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

Если функция выбрасывает что-либо за пределами своего объявления throw, во время выполнения С++ следует вызвать std:: неожиданно, если я правильно помню.

Ответ 2

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

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

Ответ 3

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

Ответ 4

Я не знаю, может ли контролер/компилятор сделать это. Возможно, проще прокомментировать это в объявлении функции. Ну, это не дурацкое доказательство, но если люди видят, что может возникнуть исключение, чем большинство людей, он завершает вызов функции в try и catch.

//Can throw Exception
GetFoo();