Используется ли для С++ броска?
Я начал использовать исключения С++ единообразно, и теперь мне хотелось бы, чтобы компилятор (g++) проверял, нет ли утечек исключений. Декорация throw
должна делать это, например, const
для констант методов класса.
Ну, это не так.
Использование throw
по-прежнему документально, но может даже оказаться опасным для введения в заблуждение, если другие считают, что функция не может выбрасывать другие исключения, кроме тех, которые указаны в его документации.
Можно ли как-то убедить g++ быть более строгим в его проверке на бросок, т.е. действительно удостовериться, что функция, украшенная как throw()
, никогда никогда не выбросит что-либо.
Изменить:
Нашел этот вопрос, рассматривая этот вопрос широко.
Ответы
Ответ 1
Он не проверяет время компиляции, но соответствующий компилятор должен обеспечить его во время выполнения.
Если функция выбрасывает что-либо за пределами своего объявления throw, во время выполнения С++ следует вызвать std:: неожиданно, если я правильно помню.
Ответ 2
Я также рекомендую посмотреть это эссе об спецификациях исключений. Он указывает на проблемы этой функции С++, такие как:
- Это система теневого типа
- Компилятор проверяет исключенные исключения только во время выполнения
- Приведенное поведение по умолчанию в случае порожденного, но не указанного исключения обычно непригодно и часто неправильно понимается программистами.
Ответ 3
В принципе, спецификации исключений являются хорошими только в качестве пустой спецификации исключения. В противном случае я думаю, что это эксперимент, который не прошел. Посмотрите ответ phlipsy.
Ответ 4
Я не знаю, может ли контролер/компилятор сделать это. Возможно, проще прокомментировать это в объявлении функции. Ну, это не дурацкое доказательство, но если люди видят, что может возникнуть исключение, чем большинство людей, он завершает вызов функции в try и catch.
//Can throw Exception
GetFoo();